2017-10-15 46 views
0

Djangoクラスベースの汎用ビューを使用しています。私のmodels.pyには、m2mという多対多のフィールドを持つMyModelというモデルがあります。私はm2mフィールドを編集できる複数のユーザーグループを持っています。各グループのユーザーは、その部分を表示してフィールドに追加するだけで、get_formを使用してm2mフィールドに表示される内容を設定することができます。私が抱えている問題は、あるユーザが自分のレコードを入力すると、m2mフィールドの最初のレコードが削除されるということです。私は何らかの形でm2mフィールドから初期値を取得し、フォームがサブミットされたときにそれらを新しいものに追加する必要があります。ここに私のviews.pyです:Django UpdateView - 多対多フィールドの初期データを取得し、フォームを保存するときに追加します。

class MyModelUpdate(UpdateView): 
model = MyModel 
fields = ['m2m'] 

def get_initial(self): 
    return initials 

def get_form(self, form_class=None):  
    form = super(MyModelUpdate, self).get_form(form_class) 
    form.fields["m2m"].queryset = DiffModel.objects.filter(user = self.request.user) 
    return form 

def form_valid(self, form): 
    form.instance.m2m.add(??? add the initial values) 
    return super(MyModelUpdate, self).form_valid(form) 

def get_success_url(self): 
    ... 

答えて

0

検索とコーディングの数日後、私は解決策を見つけました。

views.py:

from itertools import chain 
from .forms import MyForm, 

def MyModelUpdate(request, pk): 
template_name = 'mytemplate.html' 
instance = MyModel.objects.get(pk = pk) 

instance_m2m = instance.m2m.exclude(user=request.user) 

if request.method == "GET": 
    form = MyForm(instance=instance, user=request.user) 
    return render(request, template_name, {'form':form}) 
else: 
    form = MyForm(request.POST or None, instance=instance, user=request.user) 
    if form.is_valid(): 
     post = form.save(commit=False) 
     post.m2m = chain(form.cleaned_data['m2m'], instance_m2m) 
     post.save() 
     return redirect(...) 

forms.py:

from django import forms 
from .models import MyModel 

class MyForm(forms.ModelForm): 
class Meta: 
    model = MyModel 
    fields = ['m2m'] 

def __init__(self, *args, **kwargs): 
    current_user = kwargs.pop('user') 
    super(MyForm, self).__init__(*args, **kwargs) 
    self.fields['m2m'].queryset = self.fields['m2m'].queryset.filter(user=current_user) 
関連する問題