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
?