【发布时间】:2017-12-21 22:26:32
【问题描述】:
我有一个汽车模型,我想通过相互依赖的 ModelChoiceField 进行过滤:
class Car(models.Model):
make = models.CharField(max_length=50)
model = models.CharField(max_length=50)
platform = models.CharField(max_length=50)
Forms.py:
class MakeSelectForm(forms.ModelForm):
make = forms.ModelChoiceField(queryset=Car.objects.values_list('make',flat=True).distinct())
class Meta:
model = Car
fields = ["make"]
class ModelSelectForm(forms.ModelForm):
model = forms.ModelChoiceField(queryset=Car.objects.values_list('model',flat=True).distinct())
class Meta:
model = Car
fields = ["make", "model"]
Views.py:
def make_select_view(request):
form = MakeSelectForm()
make = None
if request.method == "POST":
form = MakeSelectForm(request.POST)
if form.is_valid():
make = form.cleaned_data['make']
return render(request, "reviews/makeselect.html", {"form": form, "make": make})
def model_select_view(request, make):
form = ModelSelectForm()
model = None
if request.method == "POST":
form = MakeSelectForm(request.POST)
if form.is_valid():
model = form.cleaned_data['model']
return render(request, "reviews/modelselect.html", {"form": form, "model": model})
网址:
urlpatterns = [
url(r'^$', views.make_select_view, name="make-select"),
url(r'^(?P<make>\w+)/$', views.model_select_view, name="model-select"),
]
Makeselect.html:
<form action="{% url 'reviews:model-select' make %}" method="POST">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Select" />
</form>
现在,我必须在发布时将第一个表单的“make”参数传递给第二个视图,然后使用它来过滤具有该 make 的 Car 实例。但是这里我通过的只是“无”,并得到选择一个有效的选择。该选项不是可用选项之一。第二种形式的错误。
欢迎和非常感谢任何建议或反馈。
谢谢。
【问题讨论】:
-
您需要通过第二个视图将您从第一个表单获得的信息传递到第二个表单。我认为您需要覆盖第二种形式的
__init__来调整所需字段的查询集。以下是我当天所做的 def __init__(self, *args, **kwargs): self.request = kwargs.pop('request', None) super(GameForm, self).__init__(*args, ** kwargs) 如果不是 self.request.user.is_staff: self.fields['publisher'].queryset = Publisher.objects.filter(id=self.request.user.id) `
标签: python django forms modelform modelchoicefield