web-dev-qa-db-ja.com

フォームのユーザーフィールドを現在ログインしているユーザーに設定するにはどうすればよいですか?

私は選挙情報アプリを作成していますが、現在ログインしているユーザーが自分自身および自分だけを候補者として宣言できるようにしたいです選挙で。

Djangoの組み込みModelFormとCreateViewを使用しています。私の問題は、Run for Officeフォーム(つまり、「候補者の作成」フォーム)を使用すると、ユーザーがデータベース内のanyユーザーを選択できることです。候補者を作る。

Run for Officeのユーザーフィールドを現在ログインしているユーザーに自動的に設定し、この値を非表示にして、ログインしているユーザーがフィールドの値を他のユーザーに変更できないようにしたい。

views.py

class CandidateCreateView(CreateView):
    model = Candidate
    form_class = CandidateForm
    template_name = 'candidate_create.html'

    def form_valid(self, form):
        f = form.save(commit=False)
        f.save()
        return super(CandidateCreateView, self).form_valid(form)

forms.py

class CandidateForm(forms.ModelForm):
    class Meta:
        model = Candidate

models.py

class Candidate(models.Model):
    user = models.ForeignKey(UserProfile)
    office = models.ForeignKey(Office)
    election = models.ForeignKey(Election)
    description = models.TextField()

    def __unicode__(self):
        return unicode(self.user)

    def get_absolute_url(self):
        return reverse('candidate_detail', kwargs={'pk': str(self.id)})
21
Mitch Downey
  1. レンダリングされたフォームからユーザーフィールドを削除します(excludeまたはfieldsを使用、 https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#selecting-the -使用するフィールド

    class CandidateForm(forms.ModelForm):
        class Meta:
            model = Candidate
            exclude = ["user"]
    
  2. 作成ビューでユーザープロファイルを検索し、ユーザーフィールドを設定します。

    class CandidateCreateView(CreateView):
        ...
        def form_valid(self, form):
            candidate = form.save(commit=False)
            candidate.user = UserProfile.objects.get(user=self.request.user)  # use your own profile here
            candidate.save()
            return HttpResponseRedirect(self.get_success_url())
    
42
nmb.ten