繁体   English   中英

如何处理 CreateView 中的对象引用

[英]How to handle object reference in CreateView

我有一个项目。 一个项目可以有很多评论。 我希望在项目的上下文中创建评论。 因此,我从 url 中捕获 pk 并将其添加到上下文中。

这就是我卡住的地方,我不确定如何访问 form_valid 中的上下文,更重要的是,我担心我试图走的路似乎很糟糕。

本质上,当用户准备提交评论时,应用程序将知道它所引用的项目。 什么是最 pythonic/django-onic 的方法来做到这一点?

楷模

class Item(models.Model):
    name = models.CharField(max_length=100)
    source = models.ForeignKey('Source')   

class Review(models.Model):
    rating = models.CharField(max_length=30)
    value = models.CharField(max_length=30)
    date = models.DateField(auto_now_add=True)
    comment = models.CharField(blank=True,max_length=100) 

    item = models.ForeignKey(Item,blank=True)
    user = models.ForeignKey(User)

网址

url(r'^review/create/item/(?P<itempk>\d+)',views.ReviewCreate.as_view(),name='review_create'),

观看次数

class ReviewCreate(CreateView):
    model = Review
    fields = ['rating', 'value', 'comment']

    def get_context_data(self, **kwargs):
        context = super(ReviewCreate, self).get_context_data(**kwargs)
        itempk = self.kwargs['itempk']
        item = get_object_or_404(Item, pk=itempk)
        context['item'] = item
        return context

    def form_valid(self, form):
        review = form.save(commit=False)
        review.user = self.request.user
        context = super(ReviewCreate, self).get_context_data(**kwargs) '''doesn't work'''
        review.item = context['item']

        return super(ReviewCreate, self).form_valid(form)


    template_name = 'food/review_form.html'

get_context_data方法旨在返回模板的上下文,所以我同意在form_valid中调用它有点form_valid

您可以改为在dispatch方法中获取项目并将其存储为self.item 然后您可以检索get_context_dataform_valid的项目。

form_valid您可以修改form.instance - 这样您就不必使用commit=False进行保存。

class ReviewCreate(CreateView):
    model = Review
    fields = ['rating', 'value', 'comment']

    def dispatch(self, request, *args, **kwargs):
        itempk = self.kwargs['itempk']
        self.item = get_object_or_404(Item, pk=itempk)
        return super(ReviewCreate, self).dispatch(request, *args, **kwargs)

    def get_context_data(self, **kwargs):
        context = super(ReviewCreate, self).get_context_data(**kwargs)
        context['item'] = self.item
        return context

    def form_valid(self, form):
        form.instance.user = self.request.user
        form.instance.item = self.item
        return super(ReviewCreate, self).form_valid(form)

    template_name = 'food/review_form.html'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM