2016-12-13 7 views
0

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 %} 
+0

Okay, wusste nicht, diese save_m2m existiert, aber es sieht aus wie das gleiche Problem. Ich habe es verpasst. – nicoco

Antwort

1

Wenn ModelForms für viele-zu-viele-Beziehungen verwenden, und verwenden form.save(commit=False), müssen Sie auch form.save_m2m() nennen. Viele-zu-viele-Beziehungen müssen in einem zweiten Schritt gespeichert werden, nachdem das ursprüngliche Objekt erstellt wurde; Andernfalls wäre seine ID nicht bekannt.

Weitere Einzelheiten finden Sie in der Erklärung in der Dokumentation: https://docs.djangoproject.com/en/1.10/topics/forms/modelforms/#the-save-method

Verwandte Themen