0

我有一个表格,用户可以在其中检查他们是否拥有特定品牌的商品。选中该框后,选中的项目下方会出现一个文本框以进行产品评论。

我的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 中做到这一点?

4

1 回答 1

0

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

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

但是,我不认为这就是你要找的,看起来你确实想要一个普通的外键,所以放弃 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需要一个名为brand_name的字段?已经是品牌表了,模型就叫品牌,直接叫名字不是更有意义吗?同样的事情也适用于owned_brand,它应该只是拥有,product_review 应该只是审查

于 2013-09-07T22:50:48.010 回答