Django queryset для пользователя

models.py (сокращено до того, что имеет значение)

class Messages(models.Model):
    sender = models.ForeignKey(Profile,related_name='sender',on_delete=models.CASCADE)
    receiver = models.ForeignKey(Profile,related_name='receiver',on_delete=models.CASCADE)

forms.py

class MessageForm(forms.ModelForm):
    subject = forms.CharField(max_length=100, required=False, help_text='Optional.')
    text = forms.CharField(max_length=4096, required=True, help_text='Required.')
    class Meta:
        model = Messages
        fields = ('receiver','subject','text',)

У меня есть выпадающий список, который показывает всех пользователей, которые были сделаны Я хотел бы отфильтровать его на основе некоторых полей, таких как is_active, чтобы показать только пользователей, которые аутентифицированы и многое другое, так что я хотел бы переопределить Я думаю, что это приемник queryset.

def index(request):

    sendMessageForm = MessageForm()


if is_staff:
   if is_active:
else:

Что отображает моя текущая форма.

<select name="receiver" required="" id="id_receiver">
  <option value="" selected="">---------</option>

  <option value="39">1</option>

  <option value="40">2</option>

  <option value="41">3</option>

  <option value="42">4</option>

</select>

Вы можете переопределить queryset поля в init формы следующим образом:

class MessageForm(forms.ModelForm):
    subject = forms.CharField(max_length=100, required=False, help_text='Optional.')
    text = forms.CharField(max_length=4096, required=True, help_text='Required.')
    class Meta:
        model = Messages
        fields = ('receiver','subject','text',)

    def __init__(self, *args, user=None, **kwargs):
        user = kwargs.pop('user')  # use this for your filter
        super().__init__(*args, **kwargs)
        self.fields['receiver'].queryset = Profile.objects.filter(...)

Таким образом, обновляя доступные варианты выбора в выпадающем списке при отображении формы.

Возможно, в вашем профиле есть список друзей, который сам по себе является M2M, и вы хотите фильтровать только профили пользователей, которые находятся в списке друзей отправителя. Это было бы вариантом использования приведенного выше кода.

Вы также можете явно объявить поле следующим образом:

receiver = forms.ModelChoiceField(queryset=Profile.objects.filter(...))

Примечание: используя этот метод, вы не сможете использовать request.user, поэтому он не будет действителен для вас.

И согласно вашему комментарию, чтобы позволить вам получить доступ к request.user внутри функции inittion:

def index(request):
    sendMessageForm = MessageForm(user=request.user)

В качестве дополнительного бонуса, мы всегда используем змеиный регистр для переменных в python. Поэтому ваша переменная должна быть send_message_form и, кроме того, если это единственная форма на странице, почему бы просто не сократить ее до form ?

Вернуться на верх