2016-08-06 2 views
0

유형 1 사용자가 게시물을 만들고 유형 1 사용자가 게시물에 입찰 할 수있는 장고 프로젝트를 만들었습니다. 마지막으로 경매가 발생하고 post_owner가 입찰을 수락 할 수 있습니다. 이 모든 과정이 끝나면 post 인스턴스를 데이터베이스에서 제거하여 post_queryset에 나타나지 않게하려고합니다. 이를 위해 경매 후 수신 된 신호를 사용하여 시도했으며 Post 모델에서 인스턴스를 삭제하기 전에 보관했습니다. 그러나 이것은 효과가 없습니다. 이 문제를 해결하기위한 접근 방법이 있습니까? 나는 이것을 성취하는데 나를 도와 주셔서 감사합니다.Python/Django : 작업 후에 인스턴스를 자동으로 삭제하는 방법은 무엇입니까?

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) 

답변

1

당신이 정말로 원하는 경우 개체, 최선의 장소를 삭제 그것은 아마 당신이 입찰을 수락하기 위해, 당신이 객체를 사용한 후에, 그러나 당신이 페이지를 사용자에게 반환하기 전에 사용하고 있다는 견해에있을 것입니다. 적절한 기능을 덮어 쓰면 클래스 기반 뷰에서이를 수행 할 수 있습니다.

accepted = models.BooleanField(default=False) 

간단히보기는이 값을 True로 설정 : 당신은 단지의 검색어에서 제외하고자하는 경우

또는, 당신은 귀하의 모델 라인을 추가 할 수 있습니다. 이렇게하면 사용자가 무언가를 뒤집고 싶을 때 데이터가 보존됩니다. 그런 다음 Post.objects.filter(accepted=False) 같은 쿼리 세트를 사용하면 찾고있는 포스트 오브젝트 만 검색 할 수 있습니다.

신호에 관해서는 다른 사람이 설정 한대로 작동하도록 도와 줄 수는 있지만 신호가 클래스 내에서 호출되는 방법을 잘 모르겠습니다. 일반적으로 파일 내의 클래스에 배치되지 않지만 단순히 독립형 메소드입니다. 그러나 일부는 모델 클래스 안에 넣어서 @classmethod이라는 레이블을 붙이는 것을 선호하는 것으로 나타났습니다.

나는 그곳을 통해 내 수입을 별도의 signals.py 파일의 방법으로 그들을 배치하는 것을 선호하고 경로 : 내 포스트 모델에 (가능)을 BooleanField을 추가하여 말했듯이

from My_app.signals import Post 
+0

이 Adam_Starrh @, 내가했다. 내 accept_bid보기에서이 값을 내 질문에 ModelForm (AcceptedForm) 함께 전달합니다. 여기서는 Boolean_Field 값을 저장하면서 accept_bid 인스턴스를 저장하는 뷰를 만들었습니다. 그러나 인스턴스를 저장할 때 IntegrityError : (1048, "Column 'date'는 null 일 수 없음)을 반환합니다. 이 문제에 대해 저를 도울 수 있습니까? – sumanth

+1

모델의 'date' 필드에 정보를 전달하거나이 필드에'null = True'를 설정해야하는 것처럼 들립니다. 추가 도움이 필요하면 모델과 뷰를 새로운 질문에 게시하십시오. –

관련 문제