Я работал над следующим учебным пособием для автозаполнения Django Light:
https://django -autocomplete-light.readthedocs.io / о / ведущий / tutorial.html
Я успешно реализовал автозаполнение для одного из полей в моей форме, однако мне не удалось заполнить следующий раздел:
https://django -autocomplete-light.readthedocs.io / о / мастер / tutorial.html # создания-оф-нового-выбор-в-автозаполнения-форма
В документации говорится, что я должен иметь возможность добавить функцию, которая позволяет пользователю создавать новый выбор в форме, если его требуемый выбор недоступен. Однако в руководстве не совсем ясно, как объяснить, как это сделать.
Я пытаюсь реализовать форму, в которой пользователь может создать новый отзыв по:
- Выбор из списка автозаполнения категорий
- Выбор сообщения, соответствующего выбранной категории
- Если категория или сообщение, которое они хотят выбрать, недоступны, они должны иметь возможность добавить к существующим вариантам
Я частично это реализовал, но, похоже, он работает неправильно, как будто ни одна категория не выбрана, в раскрывающемся списке «Сообщения» отображается список категорий. Однако если выбрана категория, при необходимости отображаются правильные сообщения.
models.py
class Feedback(models.Model):
feedback_id = models.IntegerField(primary_key=True,default=0)
pre_defined_message = models.ForeignKey('Message',on_delete=models.CASCADE,null=True,blank=True) # Selected from a pre defined list depending on selected category
points = models.IntegerField(default=0)
lecturer = models.ForeignKey('LecturerProfile', on_delete=models.CASCADE, null=True, blank=True)
student = models.ForeignKey('StudentProfile', on_delete=models.CASCADE, null=True, blank=True)
which_course = models.ForeignKey('Course', on_delete=models.CASCADE, null=True, blank=True)
datetime_given = models.DateTimeField(default=timezone.now, blank=False)
optional_message = models.CharField(max_length=200,default="")
category = models.ForeignKey('Category', on_delete=models.CASCADE, null=True, blank=True)
class Category(models.Model):
name = models.CharField(max_length=20, default="Empty",primary_key=True)
def __str__(self):
return self.name
class Message(models.Model):
category = models.ForeignKey('Category',on_delete=models.CASCADE,null=True,blank=True)
text = models.CharField(max_length=200,default="No message",primary_key=True)
def __str__(self):
return self.text
forms.py
class FeedbackForm(autocomplete.FutureModelForm):
optional_message = forms.CharField(max_length=200, required=False)
class Meta:
model = Feedback
fields = ('category', 'pre_defined_message','optional_message','points')
widgets = {
'pre_defined_message': autocomplete.ModelSelect2(url='category_autocomplete',forward=['category']),
'category': autocomplete.ModelSelect2(url='category_autocomplete')
}
help_texts = {
'pre_defined_message': "Select a Message",
'category': 'Category',
'optional_message': "Optional Message",
'points': "Points"
}
views.py
class CategoryAutocomplete(autocomplete.Select2QuerySetView):
def get_queryset(self):
if not self.request.user.is_authenticated or not self.request.user.is_lecturer:
return Category.objects.none()
query_set = Category.objects.all()
category = self.forwarded.get('category', None)
if self.q:
query_set = query_set.filter(name__istartswith=self.q)
return query_set
if category:
query_set = Message.objects.filter(category=category)
return query_set
urls.py
re_path(r'^category-autocomplete/$', CategoryAutocomplete.as_view(create_field='name'), name='category_autocomplete'),
Некоторое время я искал ответ на этот вопрос и изо всех сил пытался найти решение.
Я также знаю, что мой файл forms.py, в частности, может содержать не самый эффективный / чистый код, и я открыт для предложений по его улучшению. Я попытался определить метод init , но не смог сделать это успешно.
Заранее спасибо