python - 如何处理CreateView中的对象引用

标签 python django python-2.7 django-views

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

您可以改为在 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'

关于python - 如何处理CreateView中的对象引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42134436/

相关文章:

html - 使用 selenium 和 python 向下滚动 html 表

python - matlab到python通信的最佳方式

python - 带有 osx 后端的 Matplotlib 3.0

python - 如何在 pygame 窗口和函数之间转换

Python 单元测试 : how to satisfy nose coverage for importing packages

Python - 用户输入以确定 while 循环中的条件

linux - 通过python进行glob函数后的文件编辑

python - 用 Anaconda 安装了一个包,无法在 Python 中导入

python - IIS 不使用 PyISAPIe 链接到 Django

python - 从数据库填充 ChoiceField