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