Ich versuche, ein Debt
Modell mit Django zu erstellen. Es hat ein debtors
Feld, das eine Schuld mit vielen Benutzern verbindet.Django-Formular funktioniert nicht für ManyToMany (auth.users)
Es verhält sich so, wie ich es von Djangos Administrationsbereich möchte, aber ich kann es nicht mit einem Django-Formular zum Laufen bringen. Ich kann Schulden erstellen, aber das Feld "Debitoren" wird leer, obwohl der Browser eine genaue Liste der Benutzer zur Auswahl anzeigt.
Was noch überraschender ist, dass ich dachte, dass die Verwendung von blank=False
in der Modelldefinition dies nicht zulassen sollte.
models.py:
from django.db import models
from django.utils import timezone
class Debt(models.Model):
author = models.ForeignKey('auth.User', related_name='author')
name = models.CharField(max_length=200)
amount = models.FloatField()
debtors = models.ManyToManyField('auth.User', blank=False)
invoice = models.FileField(blank=True)
created_date = models.DateTimeField(default=timezone.now)
def __str__(self):
return self.name
forms.py:
from django import forms
from .models import Debt
class NewDebtForm(forms.ModelForm):
class Meta:
model = Debt
fields = ('name', 'amount', 'invoice', 'created_date', 'debtors')
views.py:
from django.shortcuts import render, redirect
from .models import Debt
from .forms import NewDebtForm
def debt_list(request):
if request.method == "POST":
form = NewDebtForm(request.POST)
if form.is_valid():
debt = form.save(commit=False)
debt.author = request.user
debt.save()
debts = Debt.objects.order_by('created_date')
form = NewDebtForm()
return render(request, 'debt_share/debt_list.html',
{'debts': debts,
'form': form})
debt_list.html:
{% extends 'debt_share/base.html' %}
{% block content %}
{% for debt in debts %}
<h1>{{ debt.name }}</h1>
<h2>payé par {{ debt.author }}</h2>
<h2>{{ debt.amount }} {{ debt.invoice }}</h2>
<p>
Concerne
{% for user in debt.debtors.all %}
{{ user }}
{% endfor %}
</p>
{% endfor %}
<form method="POST">{% csrf_token %}
{{ form.as_p }}
<button type="submit">Save</button>
</form>
{% endblock content %}
Okay, wusste nicht, diese save_m2m existiert, aber es sieht aus wie das gleiche Problem. Ich habe es verpasst. – nicoco