2016-12-13 4 views
0

Djangoを使用してDebtモデルを作成しようとしています。それは多くのユーザーに負債をリンクするdebtorsフィールドを持っています。DjangoはManyToMany(auth.users)で動作しません

これは、私がDjangoの管理パネルでやりたいように動作しますが、Djangoフォームを使用して動作させることはできません。私は債務を作成することができますが、債務者のフィールドは空いていますが、ブラウザーには選択できるユーザーの正確なリストが表示されています。

さらに驚くべきことは、モデル定義でblank=Falseを使用すると、それが許されないと考えられたことです。

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

さて、このsave_m2mが存在を知っているが、それは同じ問題のように見えませんでした。見逃した。 – nicoco

答えて

1

多対多の関係のためにModelFormsを使用して、そしてform.save(commit=False)を使用し、あなたもform.save_m2m()を呼び出す必要があります。元のオブジェクトが作成された後、多対1の関係は2番目のステップで保存する必要があります。さもなければ、そのIDは知られていないでしょう。

詳細については、ドキュメント内の説明を参照してください。https://docs.djangoproject.com/en/1.10/topics/forms/modelforms/#the-save-method

関連する問題