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

まず最初に、なぜあなたが一意の外部キーを持っているのか理解できません。外部キーの考え方は、ManyToOne の関係を作成することです (各ブランドは複数の製品を持つことができます)。しかし、何らかの理由で、unique=True を追加しました。これにより、事実上、一種の OneToOne 関係が強制されます。さて、ドキュメントを引用するために、機能が利用できる理由があります:

概念的には、この [1 対 1 の関係] は、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_name というフィールドが必要なのはなぜですか? それはすでにブランドのテーブルであり、モデルは Brand と呼ばれています。単に名前と呼ぶ方が理にかなっているでしょうか? 単に所有されるべきである own_brand と、単にレビューされるべきである product_review についても同じことが言えます。

于 2013-09-07T22:50:48.010 に答える