Как получить данные ChoiceField на основе текущего пользователя - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть модель 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 ]

2 голосов
/ 03 апреля 2019

Первоначально переопределить __init__() метод вашего взгляда

class VisitForm(forms.ModelForm):
    <b>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]</b>

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

    class Meta:
        model = Visit
        <b>fields = "__all__"  # small typo here</b>

Тогда, по вашему мнению,

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:
        <b>form = VisitForm(request.POST,request=request)</b>
        # check whether it's valid:
        if form.is_valid():
            # do somrthing
    .....
1 голос
/ 03 апреля 2019

Вам необходимо передать запрос от просмотра к форме.Например:

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")
...