2016-09-30 66 views
0

我正在使用智能选择。如何在模型中使用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) 

形式的.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”并在对应的ChoixModele选项列表中选择“type_modele”来创建TypeModele实例,这些选择来自步骤1)和2)

see Admin form screenshot

我哗哗有我的用户通过表单这样做。但我无法工作。

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

see form screenshot for the users

回答

1

首先哪里是你的看法?

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

Model.py中的模型Appareil在forms.py中引用?

而你的领域应该在列表[]中。

你forms.py应该是这样的:

from django import forms 

from .models import Modele 

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

你不需要写javascript。

只记得包括URL(R '^链/',包括( 'smart_selects.urls'))到你的urls.py

在你看来拨打AppareilForm阅读有关意见的细节形式

而在模板中,只需使用{{form.as_p}}和{{form.media.js}}加载JavaScript并确保在您的模板中加载静态。 {%负载静态%}

你的模板应该是这个样子

{% 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的选择说明。

+0

谢谢你Evangelos。我已将{{form.media.js}}添加到模板,现在代码正在为我工​​作。我用工作代码编辑了我的帖子。 (顺便说一下,Appareil Modele在我的文章中是一个错误,在那里没有任何关系) –