在Django中,如何将表单中的用户字段设置为当前登录的用户?

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

  1. 从呈现的表单中删除用户字段(使用excludefields,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)
  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())
    
    Run Code Online (Sandbox Code Playgroud)


Ehs*_*n88 8

假设

\n
    \n
  1. 我们不想设置,null=True因为我们不想允许null模型和/或数据库级别的用户

    \n
  2. \n
  3. 我们不想设置blank=True扰乱模型的可读性,因为用户实际上不会为空

    \n
  4. \n
\n

@nbm.ten解决方案是一个很好的解决方案。对于这个问题,它比其他利用模型来设置用户的“解决方案”有一个优势(比如这个),并且不会破坏上述假设。我们不想用模型来解决问题!

\n

但在这里我添加了另外两个基于 django 文档的解决方案(Models 和 request.user):

\n

另外两个解决方案

\n

1.使用通用的CreateView

\n
from 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)\n
Run Code Online (Sandbox Code Playgroud)\n

2. 使用基于类的视图

\n
class 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\'))\n
Run Code Online (Sandbox Code Playgroud)\n

笔记

\n
    \n
  • 请注意,这LoginRequiredMixin会阻止\xe2\x80\x99t 登录的用户访问该表单。如果我们忽略这一点,我们将需要处理form_valid()或处理未经授权的用户post()中的未经授权的用户。

    \n
  • \n
  • exclude = [\'user\']可以防止用户字段显示在表单上。

    \n
  • \n
  • 我们曾经form.instance.user将用户设置为否,form.data否则form.cleaned_data它们不起作用

    \n
  • \n
\n