使用Ajax动态更新Django表单字段选项以获取新的查询集

时间:2017-05-12 13:39:18

标签: javascript ajax django django-forms

我是编码和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,看起来它正在工作。除非有任何评论,否则我会测试并关闭。

更新:我仍然遇到浏览器后退按钮的问题。当用户单击后退时,下拉值已更改回原始查询集而不是更新后的版本。

2 个答案:

答案 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显示它们。