如何渲染这个Django表单?

时间:2013-09-07 21:13:04

标签: python django orm django-models django-forms

我有一个表单,用户可以检查他们是否拥有特定品牌的商品。选中此框后,将在选中的项目下方显示一个文本框以进行产品审核。

我的models.py看起来像是:

class Brand(models.Model):
    owned_brand = BooleanField(default=False)
    brand_name = models.CharField(max_length=300)

class Product(models.Model):        
    brand = models.ForeignKey(Brand, unique=True)
    #Other fields that we'll ignore for this exercise go here...
    product_review = models.CharField(max_length=300)

我想要这样的伪代码:

for each brand in Brand.entry.all():
    display form for that brand

我如何在Django中做到这一点?

1 个答案:

答案 0 :(得分:0)

首先,我不明白为什么你有一个独特的外键。 foreignkey的想法是创建一个ManyToOne关系(每个品牌可以有多个产品)。但是,出于某种原因,你添加了unique = True,这事实上迫使它成为一种OneToOne关系。现在,有一个原因可以让您使用功能,引用docs

  

从概念上讲,这种[一对一的关系]类似于a   ForeignKey与unique = True,但关系的“反向”侧   将直接返回单个对象。

但是,我不认为这是你正在寻找的,似乎你想拥有一个普通的外键,所以删掉unique = True。

现在针对手头的问题,如果我理解正确,您想要获取某个品牌的每个产品的所有表单。我不完全明白你希望这一切发生在哪里,所以我把它写成了一个视图函数:

def get_formes(request, brand_pk):
    products = Brand.objects.get(pk=brand_pk).product_set.all()
    forms = [ProductForm(instance=p) for p in products]

    return render_to_response('whateva.html', {'forms': forms})

假设您正在使用ModelForm。如果没有,您可以使用initial来告诉表单从每个产品中获取哪些数据(例如ProductForm(initial = {'name':p.name})等等)。然后在模板中执行此操作:

{% for form in forms %}
    <form>
    {{ form.as_p }}
    </form>
{% endfor %}

作为最后一点,我强烈建议您更改字段名称。为什么品牌需要一个名为brand_name的领域?它已经是一个品牌表,这个模型被称为品牌,仅仅称它为名称更有意义吗?对于own_brand也是如此,应该只是拥有而且product_review应该只是审查

相关问题