Создание выпадающего меню в django для пользовательских данных, созданных только в другом классе

#python #django

Вопрос:

Я новичок в программировании, и мой первый язык/стек-Python и Django. Я понял, как создать выпадающее меню в моей форме сценария, указывающее на другой класс «Пациент», но я не могу понять, как показывать мне только данные, созданные текущим пользователем. Я в замешательстве, должен ли я включить это в свой models.py, forms.py или в views.py? Вот что у меня есть, что, по моему мнению, должно работать, но это не так. (Попробовал установить в views.py)

Models.py

 class Patient(models.Model):
    author = models.ForeignKey(get_user_model(), on_delete=models.CASCADE,)
    patient_name = models.CharField(max_length=40, unique=True)

    def __str__(self):
        return self.patient_name

class Script(models.Model):
    author = models.ForeignKey(get_user_model(), on_delete=models.CASCADE,)
    patient = models.ForeignKey(Patient, on_delete=models.CASCADE, verbose_name='Primary Patient')
 

Таким образом, мое поле пациента-это мое выпадающее меню, и оно смотрит на класс пациента, который захватывает строку имени пациента. Мне нужна только запись имени пациента, которую этот пользователь создал в раскрывающемся списке.

Views.py

 class ScriptCreateView(LoginRequiredMixin, CreateView):
    model = Script
    template_name = 'script_new.html'
    success_url = reverse_lazy('script_list')
    fields = (
                'patient',
                'drug_name', 
                'drug_instructions', 
                'drug_start_day', 
                'drug_start_time', 
                'drug_hours_inbetween', 
                'drug_num_days_take',
                
    )

#This sets user created fields only??
    def get_queryset(self, *args, **kwargs):
        return super().get_queryset(*args, **kwargs).filter(
            author=self.request.user
        )
#This sets the author ID in the form
    def form_valid(self, form): 
        form.instance.author = self.request.user
        return super().form_valid(form
        )
 

Forms.py

 class ScriptForm(forms.ModelForm):
    class Meta:
        model = Script
        fields = '__all__'

#This is requiring user login for any of these views??
    def __init__(self, user=None, *args, **kwargs):
        super().__init__(*args, **kwargs)
        if user:
            self.fields['patient'].queryset = Patient.objects.filter(author=user)
 

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

Ответ №1:

В вашем views.py файл инициализируйте форму вот так, пожалуйста

 <form or form_class> = Form(request.POST, user=request.user)
 

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

1. Я добавил это в верхнюю часть своего views.py from .forms import ScriptForm Я добавил это в ScriptCreateView form = ScriptForm(request.POST, user=request.user) , теперь я получаю эту ошибку: views.py», строка 97, в форме ScriptCreateView = Форма сценария(запрос. СООБЩЕНИЕ, пользователь=запрос.пользователь) Ошибка имени: имя «запрос» не определено Я не уверен, как определить «запрос»?

2. Возможно, вы не добавили аргумент запроса в свое представление.

Ответ №2:

Мне пришлось добавить последний запрос form.fields ниже в представлении, которое фильтровало элементы, созданные только «автором», что я и искал:

 def get_form(self):
    form = super().get_form()
    form.fields['drug_start_day'].widget = DatePickerInput()
    form.fields['drug_start_time'].widget = TimePickerInput()
    form.fields['patient'].queryset = Patient.objects.filter(author=self.request.user)
    return form