如何基于当前用户获取ChoiceField数据

时间:2019-04-03 05:19:47

标签: python django django-models django-forms

我有一个模型StaffProfile。在为Visit创建表单时,我想将staff_user数据(基于当前用户)获取到ChoiceField(to_meet)。

models.py

class StaffProfile(models.Model):
      user = models.OneToOneField(User, on_delete=models.CASCADE, 
      related_name="user_profile")
      staff_user = models.ManyToManyField(User, null=True, blank=True, 
      related_name="staff_user")

class Visit(models.Model):
     name = models.CharField(max_length=200, name="name")
     gender = models.CharField(choices=GENDER_CHOICE, max_length=1, name="gender")
     mobile = models.CharField(max_length=18, default="", name="mobile")
     to_meet = models.ForeignKey(User, on_delete=models.CASCADE)

forms.py

class VisitForm(forms.ModelForm):
   to_meet = forms.ChoiceField(choices=[], required=False, label="Select Staff")
   class Meta:
     model = Visit
     fields = ("__all__")

   def __init__(self, *args, **kwargs):
      super(VisitForm, self).__init__(*args, **kwargs)
       self.fields['to_meet'].choices = StaffProfile.objects.filter(user=request.user).values_list("staff_user")

2 个答案:

答案 0 :(得分:2)

最初覆盖视图的 __init__() 方法

class VisitForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        self.request = kwargs.pop('request', None)
        super(VisitForm, self).__init__(*args, **kwargs)
        self.fields['to_meet'].choices = [self.request.user]

    to_meet = forms.ChoiceField(choices=[], required=False, label="Select Staff")

    class Meta:
        model = Visit
        fields = "__all__"  # small typo here

然后,在您看来,

def foo_view(request):
    # if this is a POST request we need to process the form data
    if request.method == 'POST':
        # create a form instance and populate it with data from the request:
        form = VisitForm(request.POST,request=request)
        # check whether it's valid:
        if form.is_valid():
            # do somrthing
    .....

答案 1 :(得分:1)

您需要将请求从视图传递到表单。例如:

def some_view(request):
    form = VisitForm(request=request)
    # rest of the code

并以以下形式使用它:

def __init__(self, *args, **kwargs):
  request = kwargs.pop('request')
  super(VisitForm, self).__init__(*args, **kwargs)
  self.fields['to_meet'].choices = StaffProfile.objects.filter(user=request.user).values_list("staff_user")