Django智能选择ajax配置



所以我终于在管理端实现了smart-select (https://github.com/digi604/django-smart-selects),但是现在当我试图让实际的过滤器在用户端工作时,过滤器不起作用。我试图研究解决这个问题的方法,似乎我需要实现ajax才能使智能选择过滤器正常工作。我也确信我的form.py设置不正确,但我无法找出调用.objects.all()的替代方法,因为我认为智能选择将在后台进行适当的过滤。

我将包括我的models.py和forms.py,以防解决方案就在它们里面。我以前从未使用过ajax脚本,我的研究也没有向我指出从哪里开始的任何方向。

models.py

from django.db import models
from django.contrib.auth.models import User
from smart_selects.db_fields import ChainedForeignKey
class Status(models.Model):
    status = models.CharField(primary_key=True, max_length=25)
    ## For the API
    def __str__(self):
        return self.status
    ## Eliminates title plurality in the admin interface
    class Meta:
        verbose_name_plural="Status"
class Lab(models.Model):
    name = models.CharField(primary_key=True, max_length=100)
    ## For the API
    def __str__(self):
        return self.name
    ## Eliminates title plurality in the admin interface
    class Meta:
        verbose_name_plural="Lab"
class Category(models.Model):
    lab = models.ForeignKey(Lab)
    name = models.CharField(primary_key=True, max_length=100)
    ## For the API
    def __str__(self):
        return self.name
    ## Eliminates title plurality in the admin interface
    class Meta:
        verbose_name_plural="Category"

class SubCategory(models.Model):
    lab = models.ForeignKey(Lab)
    category = ChainedForeignKey(
            Category, 
            chained_field = 'lab', 
            chained_model_field = 'lab', 
            show_all = False, 
            auto_choose = True
        )
    subcategory = models.CharField(max_length=100)
    category = models.ForeignKey(Category)
    ## For the API
    #def __str__(self):
    #   return self.category
    ## Eliminates title plurality in the admin interface
    class Meta:
        verbose_name_plural="SubCategory"

forms.py

import datetime
from django import forms
## importing models
from .models import Category, Lab, SubCategory  ## need these tables to     populate dropdown menus 'Category' and 'Lab'
from submit_app.models import Incident
from smart_selects.db_fields import ChainedForeignKey
## importing crispy form utilities
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Layout, Field, Submit, Div
from crispy_forms.bootstrap import AppendedText, PrependedText, FormActions
## importing regex validator
from django.core.validators import RegexValidator
## Maybe best to try to use ModelForm....it seems to have overwhelming internet support
from django.forms import ModelForm

class IncidentForm(forms.ModelForm):
    class Meta:
        model = Incident
        fields = [  'date_occurred', 
                    'number_of_samples_affected',
                    'capa',
                    'title',
                    'description',
                    'category',
                    'lab',
                    'subcategory',
                    'upload1',
                    'upload2',
                    'upload3'
                    ]
    ## Pre-populated dropdown menu
    lab = forms.ModelChoiceField(
        queryset=Lab.objects.all(),
        label ="Lab"
    )
    ## Pre-populated dropdown menu
    category = forms.ModelChoiceField(
        queryset=Category.objects.all(),
        label = "Category"
    )
    subcategory = forms.ModelChoiceField(
        queryset=SubCategory.objects.all(),
        label = "SubCategory"
    )
    date_occurred = forms.DateField(
        label="Date Incident Occurred", 
        initial=datetime.date.today()
    )
    number_of_samples_affected = forms.IntegerField(
        label="Number of Samples Affected",
        initial='0'
    )

smart selects有它自己的表单字段类型。你正在重写category现在在你的表单:

## Pre-populated dropdown menu
category = forms.ModelChoiceField(
    queryset=Category.objects.all(),
    label = "Category"
)

从表单中删除上面的所有代码。当您使用ChainedForeignKey时,模型字段的默认表单字段类型由smart selects提供(参见源代码中的ChainedModelChoiceField)。

执行AJAX调用的Javascript是一个小的内联脚本,作为smart selects提供的表单字段的一部分呈现。

您不必用任何东西替换代码,因为当包含在ModelForm中时,该字段会自动呈现。

Ian Price的反应很好。我试过了,效果不错。问题在于jQuery库的加载。它必须是要加载的标签的第一个

Base.html

<head>
    <title>testing</title>
    {% load static %}
 <script type="text/javascript" src="http://code.jquery.com/jquery-1.9.1.js"></script>
 <script type="text/javascript" src="http://code.jquery.com/ui/1.11.4/jquery-ui.js"></script>
<script src="{% static 'smart-selects/admin/js/chainedfk.js' %}"></script>
<script src="{% static 'smart-selects/admin/js/chainedm2m.js' %}"></script>
</head>

最新更新