#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
Я добавил это в ScriptCreateViewform = 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