【发布时间】:2018-11-17 16:29:17
【问题描述】:
我一直在学习为 Django Autocomplete Light 提供的以下教程:
https://django-autocomplete-light.readthedocs.io/en/master/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 方法,但是我无法成功地做到这一点。
提前致谢
【问题讨论】:
标签: python django django-forms django-autocomplete-light