Mit*_*ney 21 django django-forms django-views
Django和stackoverflow noob在这里.我正在制作一个选举信息应用程序,我希望允许当前登录的用户能够宣布自己,并且只有他自己作为选举中的候选人.
我正在使用Django的内置ModelForm和CreateView.我的问题是Run for 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)
Run Code Online (Sandbox Code Playgroud)
forms.py
class CandidateForm(forms.ModelForm):
class Meta:
model = Candidate
Run Code Online (Sandbox Code Playgroud)
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)})
Run Code Online (Sandbox Code Playgroud)
谢谢阅读.我几天来一直坚持这个问题,非常感谢你的帮助.如果您需要更多信息,请知道.
nmb*_*ten 40
从呈现的表单中删除用户字段(使用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"]
Run Code Online (Sandbox Code Playgroud)在创建视图中查找用户配置文件并设置用户字段.
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())
Run Code Online (Sandbox Code Playgroud)我们不想设置,null=True因为我们不想允许null模型和/或数据库级别的用户
我们不想设置blank=True扰乱模型的可读性,因为用户实际上不会为空
@nbm.ten解决方案是一个很好的解决方案。对于这个问题,它比其他利用模型来设置用户的“解决方案”有一个优势(比如这个),并且不会破坏上述假设。我们不想用模型来解决问题!
\n但在这里我添加了另外两个基于 django 文档的解决方案(Models 和 request.user):
\nfrom django.contrib.auth.mixins import LoginRequiredMixin\nfrom django.views.generic.edit import CreateView\nfrom myapp.models import Candidate\n\nclass CandidateCreate(LoginRequiredMixin, CreateView):\n model = Candidate\n exclude = [\'user\']\n\n def form_valid(self, form):\n form.instance.user = self.request.user\n return super().form_valid(form)\nRun Code Online (Sandbox Code Playgroud)\nclass CandidateForm(ModelForm):\n class Meta:\n model = Candidate\n exclude = [ \'user\',]\n\nclass CandidateAddView(LoginRequiredMixin, View):\n def get(self, request, *args, **kwargs):\n form = CandidateForm()\n context = {\'form\':form}\n return render(request, \'myapp/addcandidateview.html\', context)\n \n def post(self, request, *args, **kwargs):\n \n form = CandidateForm(request.POST)\n form.instance.user = request.user\n if form.is_valid():\n form.save()\n return redirect(reverse(\'myapp:index\'))\nRun Code Online (Sandbox Code Playgroud)\n请注意,这LoginRequiredMixin会阻止\xe2\x80\x99t 登录的用户访问该表单。如果我们忽略这一点,我们将需要处理form_valid()或处理未经授权的用户post()中的未经授权的用户。
还exclude = [\'user\']可以防止用户字段显示在表单上。
我们曾经form.instance.user将用户设置为否,form.data否则form.cleaned_data它们不起作用
| 归档时间: |
|
| 查看次数: |
14588 次 |
| 最近记录: |