2016-08-06 1 views
0

Ich habe ein Django-Projekt erstellt, in dem Typ-1-Benutzer einen Post erstellen können und Typ-1-Benutzer einen Post anbieten können. Schließlich findet eine Auktion statt und ein Post-Besitzer kann ein Gebot annehmen. Nach diesem ganzen Prozess wollte ich die Post-Instanz aus der Datenbank entfernen, damit sie nicht in post_queryset erscheint. Dazu habe ich versucht, ein Signal zu verwenden, das nach einer Auktion empfangen wurde und ich habe es vor dem Löschen einer Instanz aus Post-Modell behalten. Aber das funktioniert nicht. Gibt es einen Ansatz, um dieses Problem zu lösen? Ich würde mich freuen, mir dabei helfen zu können.Python/Django: Wie lösche ich eine Instanz automatisch nach einer Aktion?

Hier ist mein 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) 

Antwort

1

Wenn Sie wirklich wollen, Löschen Sie das Objekt, den besten Ort, um es zu tun Das wäre wahrscheinlich in der Ansicht, dass Sie das Gebot annehmen, einige Zeit nachdem Sie das Objekt verwendet haben, aber bevor Sie die Seite an den Benutzer zurückgegeben haben. Dies kann in klassenbasierten Ansichten durch Überschreiben der entsprechenden Funktion erfolgen.

Alternativ, wenn Sie gerade schauen, um es von der queryset auszuschließen, können Sie eine Zeile in die Modelle hinzufügen, wie:

accepted = models.BooleanField(default=False) 

einfach Ihre Sicht diesen Wert auf True gesetzt haben. Auf diese Weise werden die Daten erhalten, wenn ein Benutzer etwas rückgängig machen möchte. Sie können dann ein Abfrage-Set wie Post.objects.filter(accepted=False) verwenden, um nur die Post-Objekte abzurufen, nach denen Sie suchen.

Wie für Ihr Signal, vielleicht kann jemand anderes Ihnen helfen, es so zu funktionieren, wie Sie es eingerichtet haben, aber ich bin nicht sicher, wie das Signal von innerhalb der Klasse aufgerufen werden soll. Im Allgemeinen werden sie nicht in Klassen innerhalb der Datei platziert, sondern sind einfach eigenständige Methoden. Allerdings habe ich gesehen, dass einige bevorzugen, sie in die Modellklasse zu legen und sie als @classmethod zu kennzeichnen.

ich es vorziehen, sich als Methoden in einer separaten signals.py Datei zu platzieren, und Route meine Importe dort durch:

from My_app.signals import Post 
+0

@ Adam_Starrh, ich tat, wie Sie gesagt hat, indem ein BooleanField Hinzufügen (angenommen) in meinem Beitrag Modell. In meiner accept_bid Ansicht übergebe ich diesen Wert mit einem ModelForm (AcceptedForm) wie in meiner Frage. Hier habe ich die Ansicht zum Speichern einer accept_bid-Instanz zusammen mit dem Speichern des BooleanField-Werts erstellt. Beim Speichern einer Instanz wird jedoch IntegrityError zurückgegeben: (1048, "Column 'date' darf nicht null sein"). Könnten Sie mir bitte in dieser Angelegenheit helfen !!! – sumanth

+1

Klingt so, als müssten Sie entweder Informationen an das Feld "date" im Modell senden oder "null = True" für dieses Feld festlegen. Veröffentlichen Sie Ihr Modell und Ihre Ansichten in einer neuen Frage, wenn Sie weitere Unterstützung benötigen. –

Verwandte Themen