我试图通过开发一个人们可以询问产品的简单页面来尝试django
这是我的模型,我可以在管理区域创建产品,显示产品页面,表单显示字段电子邮件和文本。
class Product(models.Model):
category = models.ForeignKey(Category)
title = models.CharField(max_length=100)
text = models.TextField()
class Question(models.Model):
email = models.CharField(max_length=100)
product = models.ForeignKey(Product, default=?, editable=False)
date = models.DateTimeField(auto_now=True, editable=False)
text = models.TextField()
class QuestionForm(ModelForm):
class Meta:
model = Question
但我不知道如何告诉模型该问题必须保存到哪个产品ID。
这是我的views.py
# other stuff here
def detail(request, product_id):
p = get_object_or_404(Product, pk=product_id)
f = QuestionForm()
return render_to_response('products/detail.html', {'title' : p.title, 'productt': p, 'form' : f},
context_instance = RequestContext(request))
def question(request, product_id):
p = get_object_or_404(Product, pk=product_id)
f = QuestionForm(request.POST)
new_question = f.save()
return HttpResponseRedirect(reverse('products.views.detail', args=(p.id,)))
以及网址
urlpatterns = patterns('products.views',
(r'^products/$', 'index'),
(r'^products/(?P<product_id>\d+)/$', 'detail'),
(r'^products/(?P<product_id>\d+)/question/$', 'question')
)
现在,如果我在问题模型中的产品外键的默认属性中设置了“1”(问号所在的位置),它可以正常工作,它将问题保存到产品ID 1.但我不这样做知道怎样做才能使它保存到当前产品中。
答案 0 :(得分:3)
你可以:
发送product_id
作为表单值
制作product
foreign key in your form a hidden field并将其值设置为detail
视图中产品的主键值。这样,不在product_id
视图网址和参数中需要question
,因为ID将与POST
数据一起传递。 (有关示例,请参阅link)
我会使用此选项,因为您有更清晰的question
网址,您可以在表单上对该产品进行更多验证。
或
通过网址发送product_id
在detail
视图中使用reverse构建表单action
属性,或使用url
template tag在表单模板中构建action
属性。这样,您的product_id
网址和参数中需要question
,但product
中不需要QuestionForm
字段。然后在question
视图中,只需获取产品实例并将其设置为Question
上的FK值。
示例:强>
在url
中使用products/detail.html
模板标记:
<form action="{% url question product.pk %}" method="post">
....
</form>
或在reverse
视图中使用detail
:
def detail(request, product_id):
p = get_object_or_404(Product, pk=product_id)
f = QuestionForm()
return render_to_response('products/detail.html', {
'title' : p.title,
'product': p,
'action': reverse("question", args=[p.pk,]),
'form' : f},
context_instance = RequestContext(request))
你的模板:
<form action="{{ action }}" method="post">
....
</form>
无论哪种方式,您的question
视图都需要添加一行,实际上将产品实例设置为Question
属性:
def question(request, product_id):
...
new_question.product = p