2016-08-06 2 views
0

J'ai créé un projet Django dans lequel les utilisateurs de type 1 peuvent créer un Post et les utilisateurs de type 1 peuvent enchérir sur un post. Enfin, une vente aux enchères a lieu et un post-propriétaire peut accepter une enchère. Après tout ce processus, j'ai voulu supprimer l'instance de publication de la base de données, afin qu'elle n'apparaisse pas dans post_queryset. Pour cela, je suis tenté d'utiliser un signal qui est reçu après une vente aux enchères et je l'ai gardé avant la suppression d'une instance du modèle Post. Mais ça ne marche pas. Y a-t-il une approche pour résoudre ce problème? J'apprécierais m'aider à réaliser ceci.Python/Django: Comment supprimer une instance automatiquement après une action?

Voici mon code:

Models.py:

class Post(models.Model): 

    item = models.CharField(max_length=20) 
    post_owner = models.OneToOneField(settings.AUTH_USER_MODEL, default=1) 
    date = models.DateField() 
    accepted = models.BooleanField(default = False) 



    objects = PostQuerySet.as_manager() 


class Bid(models.Model): 

    post = models.ForeignKey(Post, related_name = bids) 
    amount = models.IntegerField(max_length = 20) 
    bidder = models.ForeingKey(settings.AUTH_USER_MODEL) 

class Auction(models.Model): 

    post = models.OneToOneField(Post) 
    post_owner = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True) 
    bid = models.OneToOneField('truck.Bid', related_name='auctions') 

class PostQuerySet(models.QuerySet): 

    @receiver(post_save, sender=Auction) 
    def delete(self, sender, instance, *args, **kwargs): 

     instance.from1.delete 
     super(PostQuerySet, self).delete(*args, **kwargs) 

forms.py:

class AcceptedForm(forms.ModelForm): 


    accepted = forms.BooleanField(required=False) 

    class Meta: 
     model = Post 
     fields = ('accepted',) 

Views.py:

def accept_bid(request, post_id, bid_id): 

    post = get_object_or_404(Post, id=post_id) 
    bid = get_object_or_404(Bid, id=bid_id) 
    if request.method=='POST': 
     form = AuctionForm(request.POST or None) 
     form1 = AcceptedForm(request.POST) 
     if form.is_valid() and form1.is_valid(): 
      accept_bid = form.save(commit=False) 
      accept_bid.bid = bid 
      accept_bid.post = post 
      accept_bid.post_owner = request.user 
      accept_bid.accepted = form1.save() 
      accept_bid.save() 

      form.save() 
      form1.save() 
    else: 
     form = AuctionForm() 
     form1 = AcceptedForm() 

    context = { 

      "bid_id" : bid_id, 
      "post_id" : post_id, 
      "bid": bid, 
      "post":post, 
      'form':form, 
      'form1': form1, 

    } 
return render(request, 'loggedin_load/active_deals.html', context) 

Répondre

1

Si vous voulez vraiment supprimer l'objet, le meilleur endroit pour faire ce serait probablement dans la vue que vous utilisez pour accepter l'offre, quelque temps après que vous avez utilisé l'objet, mais avant que vous ayez renvoyé la page à l'utilisateur. Cela peut être fait dans Class Based Views en écrasant la fonction appropriée.

Sinon, si vous êtes à la recherche de l'exclure de l'queryset, vous pouvez ajouter une ligne à vos modèles tels que:

accepted = models.BooleanField(default=False) 

tout simplement votre point de vue définir cette valeur True. De cette façon, les données seront conservées si un utilisateur veut inverser quelque chose. Vous pouvez ensuite utiliser un jeu de requête tel que Post.objects.filter(accepted=False) pour récupérer uniquement les objets de publication que vous recherchez. En ce qui concerne votre signal, quelqu'un d'autre peut peut-être vous aider à le faire fonctionner comme vous l'avez fait, mais je ne suis pas sûr de la façon dont le signal est supposé être invoqué depuis la classe. Généralement, ils ne sont pas placés dans des classes dans le fichier, mais sont simplement des méthodes autonomes. Cependant, j'ai vu que certains préfèrent les mettre dans la classe du modèle et les étiqueter comme @classmethod.

Je préfère les placer comme méthodes dans un séparé fichier signals.py et itinéraire mes importations par là:

from My_app.signals import Post 
+0

@ Adam_Starrh, je l'ai comme vous l'avez dit en ajoutant un BooleanField (accepté) dans mon modèle Post. Dans ma vue accept_bid je passe cette valeur avec un ModelForm (AcceptedForm) comme dans ma question. Ici, j'ai fait la vue pour enregistrer une instance accept_bid avec la sauvegarde de la valeur BooleanField. Mais lors de la sauvegarde d'une instance, elle retourne IntegrityError: (1048, "Date de la colonne" ne peut pas être nulle "). Pourriez-vous s'il vous plaît m'aider sur cette question !!! – sumanth

+1

Il semble que vous ayez besoin de fournir des informations au champ 'date' du modèle, ou de définir' null = True' sur ce champ. Publiez votre modèle et vos vues dans une nouvelle question si vous avez besoin d'aide supplémentaire. –