3

私は次のモデルを持っています:

クラス UserProfile(models.Model):

user = models.OneToOneField(User, related_name="user")
people_interested = models.ManyToManyField(User, related_name="interested")

ここで、ユーザーが people_interested を選択できるフォームを提供するフォームが必要なので、次の forms.py を追加します。

class ChooseForm(forms.Form):
    q_set = User.objects.all()
    peers = forms.ModelMultipleChoiceField(widget=forms.CheckboxSelectMultiple, queryset = q_set)

そしてビューで:

form = ChooseForm(data = request.POST or None)
if request.POST and form.is_valid():
    uprofile, created = UserProfile.objects.get_or_create(user=request.user)
    uprofile.people_interested = form.cleaned_data['peers']
    uprofile.save()
    return HttpResponseRedirect("/")
else:
    return render(request, "form_polls.html", {'form':form})

しかし、これの問題は、現在のユーザー インスタンスも表示されることです。そこで、views.py で次のことを試しました。

form = ChooseForm(request.user.id, data = request.POST or None)

そしてforms.pyで

class ChooseForm(forms.Form):

    def __init__(self, uid, *args, **kwargs):
        super(ChooseForm, self).__init__(*args, **kwargs)
        self.fields['peers'].queryset = User.objects.exclude(id=uid)
    q_set = User.objects.all() 
    peers = forms.ModelMultipleChoiceField(widget=forms.CheckboxSelectMultiple, queryset = q_set)

しかし、上記はクリーンな実装ではありません。それを行うためのより良い方法はありますか??

4

1 に答える 1

2

これがクリーンな実装ではないと言う理由は何ですか? queryset上に上書きしても問題__init__ありません。

コードを改善するために私が行う唯一のことは、post_save信号を使用Userしてそれを作成し、ビューUserProfileで行うことだけです。この質問user.get_profile()を参照してください

ModelForm通常のフォームの代わりにforを使用しUserProfileて、フィールドを に制限することもできますpeople_interested

于 2013-02-12T15:30:04.710 に答える