【问题标题】:How to handle object reference in CreateView如何在 CreateView 中处理对象引用
【发布时间】:2017-06-27 07:53:51
【问题描述】:

我有一个项目。一个项目可以有很多评论。我希望在项目的上下文中创建评论。因此,我从 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'

【问题讨论】:

    标签: python django python-2.7 django-views


    【解决方案1】:

    get_context_data 方法旨在返回模板的上下文,所以我同意在 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'
    

    【讨论】:

    • 谢谢,工作完美,虽然我认为它需要 self.request.user
    猜你喜欢
    • 2021-10-21
    • 2014-07-14
    • 2018-12-09
    • 1970-01-01
    • 1970-01-01
    • 2014-03-15
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多