Как настроить поле пользователя в форме для текущего зарегистрированного пользователя?

Я создаю приложение с информацией о выборах и хочу, чтобы вошедший в систему пользователь мог объявить себя и только себя как кандидата на выборах.

Я использую встроенные в Django ModelForm и CreateView. Моя проблема в том, что форма "Выполнить для Office" (другими словами, форма "создать кандидата") позволяет пользователю выбрать любого пользователя в базе данных, чтобы сделать кандидата.

Я хочу, чтобы поле пользователя в 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)})

Ответы

Ответ 1

  • Удалить поле пользователя из отображаемой формы (используя exclude или fields, https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#selecting-the-fields-to-use)

    class CandidateForm(forms.ModelForm):
        class Meta:
            model = Candidate
            exclude = ["user"]
    
  • Найдите профиль пользователя и задайте поле пользователя в представлении создания.

    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())