我是编码和django的新手,我正在努力寻找解决以下问题的方法,并回顾了我找到的答案。
我正在创建一个包含多个字段的搜索表单。当用户选择第一个字段emberxxx
时(以及在点击搜索之前),我想动态更改第二个字段category
的查询集,以便仅显示相关值。
我有sub_category
如下:
models.py
我的class Product(models.Model):
category = models.ForeignKey("Category")
sub_category = models.ForeignKey("SubCategory")
class Category(models.Model):
name = models.CharField(max_length=256)
class SubCategory(models.Model):
category = models.ForeignKey("Category")
name = models.CharField(max_length=256)
包括:
forms.py
我的class BasicSearchForm(forms.Form):
category = forms.ModelChoiceField(
label='Category',
queryset=Category.objects.all(),
to_field_name="name",
empty_label=None,
initial="Red")
sub_category = forms.ModelMultipleChoiceField(
required=False,
label='Type',
queryset= SubCategory.objects.all(),
to_field_name="name",
widget=forms.Select)
包括:
views.py
最后,search.html包括:
def search(request):
if request.method == 'POST':
form = BasicSearchForm(request.POST)
if form.is_valid():
category = form.cleaned_data['category']
sub_category = form.cleaned_data['sub_category']
return render(request, 'myapp/search.html', {'form': form})
else:
form = BasicSearchForm()
return render(request, 'myapp/search.html', {'form': form})
我玩了几个答案,但似乎没什么用。我真的很感激一些帮助。提前谢谢!
更新 感谢您的反馈。结果我更新了以下内容:
在我的<form class="search-form" role="search" action="/search/" method="get">
{{ form }}
<input type="submit" value="Search" />
</form>
:
urls.py
在我的urlpatterns = [
url(r'^ajax/update_subcategories/$', views.update_subcategories, name='update_subcategories'),
:
views.py
我在def update_subcategories(request):
category = request.GET.get('category', None)
sub_category = list(SubCategory.objects.filter(category__name__exact=category).values('name'))
return JsonResponse(sub_category, safe=False)
:
myapp/search.html
更新:sub_category选项显示为[object Object],直到我将value更改为value.name,看起来它正在工作。除非有任何评论,否则我会测试并关闭。
更新:我仍然遇到浏览器后退按钮的问题。当用户单击后退时,下拉值已更改回原始查询集而不是更新后的版本。
答案 0 :(得分:1)
您无法从Django视图端(即后端)执行此操作。您可以尝试使用ajax请求来实现此类请求,方法是向服务器发送GET请求以填充下拉列表或其他任何内容。
举个简单的例子,你可以参考 这里
How do I POST with jQuery/Ajax in Django?
修改强>
def update_subcategories(request):
category = request.GET.get('category', None)
sub_category = list(SubCategory.objects.filter(category__name__exact=category).values('name'))
return JsonResponse(dict(sub_category=sub_category))
然后在ajax回复中你可以像response.data.sub_category
答案 1 :(得分:0)
使用ajax发送类别并检索子类别元素。
对于类别,通过get请求发送它,并使用orm以json格式返回子类别,您可以使用jQuery显示它们。