Как показать в форме множество объектов в разных полях?
hi я написал код для создания жанрового раздела на сайте и использовал many-to-many-field в моделях для его добавления:
from django.db import models
from django.contrib.auth.models import User
class Genre(models.Model):
name = models.CharField(unique=True,max_length=20)
def __str__(self):
return self.name.title()
class Mdata(models.Model):
name = models.CharField(max_length=100)
artist = models.CharField(max_length=150)
album = models.CharField(max_length=100)
nation = models.CharField(max_length=100)
duration = models.DecimalField(max_digits=4,decimal_places=2)
released_in = models.DecimalField(max_digits=4,decimal_places=0)
uploaded_at = models.DateTimeField(auto_now_add=True)
image = models.ImageField(upload_to='images/',blank=True,null=True)
audio = models.FileField(upload_to='audios/',null=True,blank=True)
genre = models.ManyToManyField(Genre)
uploader = models.ForeignKey(User,on_delete=models.CASCADE)
def __str__(self):
return self.name.title()+" by "+self.artist.title()
но когда я проверяю саму музыку на сайте, она просто показывает, сколько объектов я выбрал, а не жанры, как вы можете видеть здесь:
[![screen shot][1]: https://i.stack.imgur.com/xHaMK.png
вот мой шаблон:
{% extends 'pages/base.html' %}
{% block content %}
<form>
{% if mdata.image %}
<img src="mdata.image.url" height="500" width="500">
{% endif %}
{% for field in form %}
<p>{{ field.label }} : {{ field.value}}</p>
{% endfor %}
</form>
<a href="{% url 'pages:edit_music' mdata.id %}">edit</a>
{% endblock %}
и формы (формы просты, я просто добавил модели как поле):
from django import forms
from django.forms import ModelForm
from .models import Mdata
class MdataForm(ModelForm):
class Meta:
model = Mdata
fields =[
'name',
'artist',
'album',
'genre',
'nation',
'duration',
'released_in',
'image',
'audio',
]
Поле "многие ко многим" в Django по умолчанию отображается в <select multiple>
. {{ field.value }}
возвращает список id. Таким образом, [1]
на вашем скриншоте означает, что ваша MData здесь имеет один Жанр и его id равен 1.
Если вы хотите отображать названия жанров в списке, измените вашу форму на
from django import forms
from .models import MData, Genre
class MDataForm(forms.ModelForm):
genre = forms.ModelMultipleChoiceField(Genre, to_field_name='name')
class Meta:
model = MData
fields = [
'name',
'artist',
'album',
'genre',
'nation',
'duration',
'released_in',
'image',
'audio',
]
Также не забудьте окружить data.image.url
словами {{
и }}
.