如何使用django smart-selection with modelform?

时间:2016-09-30 23:14:44

标签: django

我正在使用智能选择。

编辑:在模板中添加{{form.media.js}}后,以下代码对我有用,感谢@Evangelos

models.py:

from django.db import models
from smart_selects.db_fields import ChainedForeignKey, ChainedManyToManyField

class ChoixTangente(models.Model):
    name = models.CharField(max_length=255)

    def __str__(self):
        return self.name

class ChoixModele(models.Model):
    name = models.CharField(max_length=255)
    tangentes = models.ManyToManyField('Choixtangente', blank=True)

    def __str__(self):
        return self.name    

class TypeModele(models.Model):
    tangente = models.ForeignKey(ChoixTangente, blank=True, null=True)
    type_modele = ChainedForeignKey(
        ChoixModele,
        chained_field="tangente",
        chained_model_field="tangentes",
        show_all=False, 
        auto_choose=True,
        blank=True, null=True
    )

    def __unicode__(self):
        return str(self.pk)

form.py:

from django import forms
from .models import ChoixTangente, ChoixModele, TypeModele

class TypeModeleForm(forms.ModelForm):
    class Meta:
        model = TypeModele
        fields = ('tangente', 'type_modele')

views.py

from .models import ChoixTangente, ChoixModele, TypeModele
from .forms import TypeModeleForm

def type_modele_new(request):
    if request.method == "POST":
        form = TypeModeleForm(request.POST)
        if form.is_valid():

            modele_instance = form.save()

            return redirect('calculs.views.type_modele_detail', pk=modele_instance.pk)

    else: 
        form = TypeModeleForm()  

    return render(request, 'calculs/type_modele_new.html', {'form': form})

def type_modele_detail(request, pk):
    modele_instance = get_object_or_404(TypeModele, pk=pk)
    return render(request, 'calculs/type_modele_detail.html', {'modele_instance': modele_instance})

模板:type_modele_new.html

{% load staticfiles %}

<form method="POST">
    {% csrf_token %}
    **{{ form.media.js }}**
    {{ form.as_p}}
    <input type="submit" value="Submit">
</form>  

urls.py

from django.conf.urls import url, include
from . import views
from smart_selects import urls as smart_selects_urls

urlpatterns = [
    url(r'^chaining/', include('smart_selects.urls')), 
    url(r'^type_modele/new/$', views.type_modele_new, name='modele_new'),
    url(r'^type_modele/(?P<pk>[0-9]+)/$', views.type_modele_detail, name='modele_detail'),

]

编辑:这就是问题所在:

我在管理员工作正常:

  1. 我创建了ChoixTangente实例
  2. 我创建了ChoixModele 实例并在列表中选择ChoixTangentes实例
  3. 我可以通过在ChoixTangente列表中选择“tangente”来创建TypeModele“实例”,并在步骤1)和2)所产生的相应ChoixModele选项列表中选择“type_modele”
  4. see Admin form screenshot

    我希望让我的用户通过表单执行相同的操作。但我不能让它发挥作用。

    字段“Tangente”填充了ChoixTangente列表但是当我选择一个值时,字段“type_modele”保持为空而不是显示相应选项的列表。

    see form screenshot for the users

1 个答案:

答案 0 :(得分:2)

首先,您的观点在哪里?

尝试使用文件发布更完整的问题,以便更好地理解。

您在forms.py?

中引用的models.py中的模型Appareil在哪里

你的字段应该在列表[]中。

您的forms.py应如下所示:

from django import forms

from .models import Modele

class AppareilForm(forms.ModelForm):
    class Meta:
        model = Modele
        fields =['tangente', 'modele']

您不需要编写javascript。

请记住将url(r'^ chaining /',include('smart_selects.urls'))添加到您的urls.py

在您的视图中调用AppareilForm阅读有关视图中的表单的详细信息。

在模板中使用{{form.as_p}}和{{form.media.js}}之前加载javascript并确保在模板中加载static。 {%load static%}

您的模板应该看起来像这样

{% load static % }

<form action="your url that points to your view" method="POST">
    {% csrf_token %}
    {{ form.media.js }}
    {{ form.as_p}}
    <input type="submit" value="Submit">
</form>

仔细阅读django-choices描述。