将当前的product_id传递给Django中的Model

时间:2011-05-28 22:29:18

标签: python django

我试图通过开发一个人们可以询问产品的简单页面来尝试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.但我不这样做知道怎样做才能使它保存到当前产品中。

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