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