Форма Django не сохраняет значение в полях множественного выбора
Я использую Django's ModelForm и по какой-то причине моя форма не сохраняет значения полей множественного выбора. Вот моя models.py
:
class CaptureVersion(models.Model):
id_capture = models.AutoField(primary_key=True)
name = models.CharField(unique=True, max_length=50, verbose_name="Nom Disseny")
int_reference_number = models.CharField(max_length=15, unique=True, blank=True, null=True, verbose_name='IRN')
capture_version_id_provider = models.ForeignKey(Provider, on_delete=models.CASCADE, db_column='id_provider', verbose_name='Proveïdor')
associated_register = models.CharField(max_length=150, blank=True, null=True, verbose_name='Registre associat')
start_date = models.DateField(blank=True, null=True, verbose_name='Data Alta')
end_date = models.DateField(blank=True, null=True, verbose_name='Data Baixa')
target_size = models.DecimalField(max_digits=6, decimal_places=2, blank=True, null=True, verbose_name='Regions diana (Mb)')
probe_size = models.DecimalField(max_digits=6, decimal_places=2, blank=True, null=True, verbose_name='Sondes (Mb)')
sections = models.ManyToManyField(Section, blank=True, verbose_name="Secció")
responsibles = models.ManyToManyField(Responsible, blank=True, verbose_name="Responsable/s")
class Meta:
ordering = ['start_date']
db_table = 'capture_version'
А мой forms.py
:
class FormulariCaptura(ModelForm):
class Meta:
model = CaptureVersion
fields = ("name", "int_reference_number", "capture_version_id_provider", "associated_register", "start_date",
"end_date", "target_size", "probe_size", "sections", "responsibles",)
Проблемой являются поля sections
и responsibles
, которые являются внешними ключами. Когда я выбираю одно из значений выпадающего списка в форме, проблем нет, и запись сохраняется без видимых ошибок, но значение в таблице для этого поля -
. Но если я делаю это в админке, то все работает или если я редактирую запись с помощью UpdateView
.
Это работало вчера и я ничего не менял...
Мой views.py
:
def capture_form(request):
formulari_captura=FormulariCaptura()
if request.method=="POST":
formulari_captura=FormulariCaptura(request.POST or None)
if formulari_captura.is_valid():
feedback = formulari_captura.save(commit=False)
capture = CaptureVersion.objects.all()
feedback.capture = capture
feedback.save()
messages.success(request, 'Kit de captura enregistrat correctament!')
return render(request, "captureVersion/formulari_captura.html", {'formulari':formulari_captura})
Мой form.html
:
<div class="formMostra">
{% if messages %}
{% for message in messages %}
<p style="margin: 20px;" {% if message.tags %} class=" {{ message.tags }} " {% endif %}> {{ message }} </p>
{% endfor %}
{% endif %}
<form action="" method="POST" style="text-align: justify;">
{% csrf_token %}
<table style="margin: 20px;">{{formulari.as_table}}</table>
<input type="submit" value="Afegir" style="width: 100px; margin: 20px; margin-right: 0px;" class="btn btn-primary">
<input onclick="location.href='/sample/'" value="Cancel·lar" style="width: 100px; margin: 20px; margin-left: 0px;" class="btn btn-light">
</form>
В файле 'form.html' нужно поставить атрибут 'action'.
-> Атрибут 'action' указывает форме, куда отправлять данные. Без этой информации ничего не произойдет...
Вы должны поставить что-то вроде:
<form action="{% url 'test_url' %}" method="POST">
Как описано в docs
:
Вызов save_m2m() требуется только в том случае, если вы используете save(commit=False). Когда вы используете save() на форме, все данные - включая данные типа "многие ко многим" - сохраняются без необходимости дополнительных вызовов методов.
.
Если вы используете save(commit=False)
, вы должны вызвать save_m2m()
после, так:
feedback = formulari_captura.save(commit=False)
feedback.save()
formulari_captura.save_m2m()