我有一个表单,用户可以检查他们是否拥有特定品牌的商品。选中此框后,将在选中的项目下方显示一个文本框以进行产品审核。
我的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中做到这一点?
答案 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应该只是审查