Как настроить поле пользователя в форме для текущего зарегистрированного пользователя?
Я создаю приложение с информацией о выборах и хочу, чтобы вошедший в систему пользователь мог объявить себя и только себя как кандидата на выборах.
Я использую встроенные в 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())