私は関係manytomanyからすべてのデータを取得しようとしています、これは私のモデルです
class Product(models.Model):
name = models.CharField(max_length=100)
image = models.FileField(upload_to='products/', null=True)
price = models.FloatField(default=0)
stock = models.CharField(max_length=15)
categories = models.ManyToManyField(Categories)
def __str__(self):
return self.name
class Categories(models.Model):
name = models.CharField(max_length=100)
def __str__(self):
return self.name
製品からデータを取得するには、次のことを試してください。
class Products(ListView):
model = Product
template_name = "products.html"
テンプレートでは、次のように戻ります。
_______________________________
# | name | price | Categories |
________________________________
1 | Pepsi | 1.25 | |
2 | Choco.| 2.50 | |
このテーブルを生成するために、私は次のサイクルを使用します。
{% for product in object_list %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ product.name }}</td>
<td>{{ product.price }}</td>
<td>{{ product.categories }}</td>
{% endfor %}
この場合、製品で選択されたカテゴリを空に戻します。提案してください。ありがとうございます。
のcategories
属性はProduct
多対多の関係であるため、複数のオブジェクトを持つ別のクエリに解決されることに注意してください。これは別のクエリセットでobject_list
あり、を行するだけなので、テンプレートにその印刷方法を明示的に指示する必要があります。
サンプルソリューションは次のとおりです。
{% for product in object_list %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ product.name }}</td>
<td>{{ product.price }}</td>
<td>
{% for category in product.categories.all %}
{{ category }}
{% endfor %}
</td>
{% endfor %}
または、django結合テンプレートタグ(https://docs.djangoproject.com/en/2.1/ref/templates/builtins/#join)を使用することもできます。
{% for product in object_list %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ product.name }}</td>
<td>{{ product.price }}</td>
<td>{{ product.categories.all|join:", " }}</td>
{% endfor %}
Djangoを始めてからあなたを助けるためのいくつかのより簡単なコメント:
class Categories
モデルの名前としてはあまり適切ではありません。class Category
各Category
インスタンスは単一のカテゴリに関連付けられるため、名前を付けることをお勧めします。class Products
ビューの悪い名前です。class ProductListView
それがあなたの製品のListViewであることがわかるように、名前を付けることを提案します。また、すべてのビューと同様の命名スキームを維持します。FloatField
価格(金銭的価値)を節約するためにを使用することは常に問題があります。その列で集計を実行しようとすると(つまり、平均を追加または取得しようとすると)、奇妙な値になります。これは、フロート数がどのように機能するかによるものです(つまり、一部の値はフロートで正確に表すことができませんが、1.3の代わりにフロートで1.2999999999999になるように、非常に近い近似値が得られます)。DecimalField
代わりにを使用して、金銭的価値を適切に保存します。context_object_name
属性をに渡すListView
ことができますobject_list
。したがって、次のProductListView
ように定義した場合:class ProductListView(ListView): model = Product template_name = "products.html" context_object_name = 'products'
{% for product in products %} ...
テンプレートで実行できるようになります。
template_name
djangoはクラスとパッケージ名から属性を生成するため、ListViewの属性を明示的に定義する理由はありません。ドキュメントのこの部分を見てください:https://docs.djangoproject.com/en/2.1/topics/class-based-views/generic-display/#generic-views-of-objects、特にこの段落:https ://docs.djangoproject.com/en/2.1/topics/class-based-views/generic-display/#generic-views-of-objectstemplate_name属性をビューに追加することで、使用するテンプレートをビューに明示的に指示できますが、明示的なテンプレートがない場合、Djangoはオブジェクトの名前からテンプレートを推測します。この場合、推測されるテンプレートは「books / Publisher_list.html」になります。「books」の部分はモデルを定義するアプリの名前に由来し、「publisher」ビットはモデル名の小文字バージョンにすぎません。
template_name
クラスの2番目のリストビューを追加して、これが意図的なものであることを明示する場合にのみ使用してください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加