Django ModelForm: как отобразить пользовательские данные в выпадающем поле?

#python #django #django-forms

#python #django #django-forms

Вопрос:

У меня есть выпадающее поле под названием Label как часть модели под названием Birthday. Моя проблема в том, что в выпадающем поле отображаются метки всех пользователей. Как я могу убедиться, что в нем отображаются только метки, характерные для данного пользователя?

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

формы

 class BirthdayForm(forms.ModelForm):
    
    class Meta:
        model = Birthday
        fields = ('name', 'day', 'label')

class LabelForm(forms.ModelForm):

    class Meta:
        model = Label
        fields = ('tag',)
  

Модели

 class Label(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    tag = models.CharField(max_length=25)
    
    def __str__(self):
        return self.tag

class Birthday(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    name = models.CharField(max_length=25, default="")
    day = models.DateField()
    label = models.ForeignKey(Label, on_delete=models.SET_NULL, default=0, null=True, blank=True) 
    
    def __str__(self):  
        return self.name
  

Вид

 @login_required
def index(request):
    if request.method == "POST":
        form = BirthdayForm(request.POST)
        if form.is_valid():
            birthday = form.save(commit=False)
            birthday.user = request.user
            birthday.save()
            return redirect('index')
    else:
        form = BirthdayForm()
    birthday = Birthday.objects.filter(user=request.user)
    username = request.user
    return render(request, 'bd_calendar/index.html', {'form': form, 'birthday': birthday, 'username': username })
  

шаблон

             <form method="POST">{% csrf_token %}
                <table border="0">
                    {{ form }}
                </table>
                <button class="submitButton" type="submit">Submit</button>
            </form>
  

Ответ №1:

попробуйте это

 class BirthdayForm(forms.ModelForm):

    class Meta:
        model = Birthday
        fields = ('name', 'day', 'label')
    def __init__(self, user, *args, **kwargs):
        super(BirthdayForm, self).__init__(*args, **kwargs)
        self.fields['label'].queryset = Label.objects.filter(user=user)
  

надеюсь, это поможет

Комментарии:

1. Я получаю эту ошибку: ошибка типа в / __init__() отсутствует 1 требуемый позиционный аргумент: ‘user’