Python 在CustomLabelModelChoiceField中使用上下文变量
我正在尝试改进我网站中的Python 在CustomLabelModelChoiceField中使用上下文变量,python,django,forms,django-models,django-forms,Python,Django,Forms,Django Models,Django Forms,我正在尝试改进我网站中的Django表单中的一些元素,我需要您的帮助,以便找到为什么我的context\u processors变量没有出现在我的筛选条件中 我有一个型号(出生证),根据另一个型号(身份)有两个外国钥匙 身份:此模型包含有关城镇居民的所有信息(姓、名等) 出生证:此模型包含有关新子女的所有信息以及来自身份模型的家长信息 当我同时显示两个ForeignKey选项字段时,列表非常长,我希望按如下方式过滤此ForeignKey: def BirthCertificate_Form(
Django表单
中的一些元素,我需要您的帮助,以便找到为什么我的context\u processors变量
没有出现在我的筛选条件中
我有一个型号(出生证
),根据另一个型号(身份
)有两个外国钥匙
- 身份:此模型包含有关城镇居民的所有信息(姓、名等)
- 出生证:此模型包含有关新子女的所有信息以及来自身份模型的家长信息
def BirthCertificate_Form(request) :
# Fonction permettant de créer le formulaire Acte de Naissance et le remplissage
query_lastname = request.GET.get('lastname')
if request.method == 'POST':
parents = Identity.objects.filter(lastname=query_lastname)
Bform = BirthCertificateForm(request.POST)
Bform.fields['fk_parent1'].queryset = parents.filter(sex="Masculin")
Bform.fields['fk_parent2'].queryset = parents.filter(sex="Feminin")
if Bform.is_valid() : # Vérification sur la validité des données
if '_save2' in request.POST :
post = Bform.save()
return HttpResponseRedirect(reverse('BC_treated', kwargs={'id': post.id}))
else:
Bform = BirthCertificateForm()
context = {
"Bform" : Bform,
"query_lastname" : query_lastname,
}
return render(request, 'BC_form.html', context)
仅显示与孩子同名的人
为了做到这一点,我使用了CustomLabelModelChoiceField
,并制作了queryset过滤器
。我也在使用context\u处理器
,但我无法在查询过滤器
中提取变量
我的models.py文件如下所示:
class BirthCertificate(models.Model):
lastname = models.CharField(max_length=30, null=False, verbose_name='Nom de famille')
firstname = models.CharField(max_length=30, null=False, verbose_name='Prénom(s)')
sex = models.CharField(max_length=8, choices=SEX_CHOICES, verbose_name='Sexe')
birthday = models.DateField(null=False, verbose_name='Date de naissance')
birthhour = models.TimeField(null=True, verbose_name='Heure de naissance')
birthcity = models.CharField(max_length=30, null=False, verbose_name='Ville de naissance')
birthcountry = CountryField(blank_label='Sélectionner un pays', verbose_name='Pays de naissance')
fk_parent1 = models.ForeignKey(Identity, related_name='ID_Parent1', verbose_name='ID parent1', null=False)
fk_parent2 = models.ForeignKey(Identity, related_name='ID_Parent2', verbose_name='ID parent2', null=False)
created = models.DateTimeField(auto_now_add=True)
class BirthCertificateForm(forms.ModelForm):
fk_parent1 = CustomLabelModelChoiceField(Identity.objects.filter(lastname = cached_queries), required=False, label = "Père", label_func=lambda obj: '%s %s %s %s' % (obj.lastname, obj.firstname, obj.birthday, obj.birthcity))
fk_parent2 = CustomLabelModelChoiceField(Identity.objects.filter(sex = "Feminin"), required=False, label = "Mère", label_func=lambda obj: '%s %s %s %s' % (obj.lastname, obj.firstname, obj.birthday, obj.birthcity))
在my views.py文件中,我有:
def BirthCertificate_Form(request) :
query_lastname = request.GET.get('lastname')
cache.set('VarLastname', query_lastname, 300)
print cache.get('VarLastname')
if request.method == 'POST':
....
在my context_processors.py文件中:
def cached_queries(request):
return {'VarLastname' : cache.get('VarLastname')}
我的forms.py文件如下所示:
class BirthCertificate(models.Model):
lastname = models.CharField(max_length=30, null=False, verbose_name='Nom de famille')
firstname = models.CharField(max_length=30, null=False, verbose_name='Prénom(s)')
sex = models.CharField(max_length=8, choices=SEX_CHOICES, verbose_name='Sexe')
birthday = models.DateField(null=False, verbose_name='Date de naissance')
birthhour = models.TimeField(null=True, verbose_name='Heure de naissance')
birthcity = models.CharField(max_length=30, null=False, verbose_name='Ville de naissance')
birthcountry = CountryField(blank_label='Sélectionner un pays', verbose_name='Pays de naissance')
fk_parent1 = models.ForeignKey(Identity, related_name='ID_Parent1', verbose_name='ID parent1', null=False)
fk_parent2 = models.ForeignKey(Identity, related_name='ID_Parent2', verbose_name='ID parent2', null=False)
created = models.DateTimeField(auto_now_add=True)
class BirthCertificateForm(forms.ModelForm):
fk_parent1 = CustomLabelModelChoiceField(Identity.objects.filter(lastname = cached_queries), required=False, label = "Père", label_func=lambda obj: '%s %s %s %s' % (obj.lastname, obj.firstname, obj.birthday, obj.birthcity))
fk_parent2 = CustomLabelModelChoiceField(Identity.objects.filter(sex = "Feminin"), required=False, label = "Mère", label_func=lambda obj: '%s %s %s %s' % (obj.lastname, obj.firstname, obj.birthday, obj.birthcity))
但是,查询筛选器不适用于myVarLastname
。我得到一张空名单
如果我替换:
CustomLabelModelChoiceField(Identity.objects.filter(lastname=cached\u查询)
byCustomLabelModelChoiceField(Identity.objects.filter(lastname=“test”)
你知道吗
编辑:
根据@Udi的回答,我的观点如下:
def BirthCertificate_Form(request) :
# Fonction permettant de créer le formulaire Acte de Naissance et le remplissage
query_lastname = request.GET.get('lastname')
if request.method == 'POST':
parents = Identity.objects.filter(lastname=query_lastname)
Bform = BirthCertificateForm(request.POST)
Bform.fields['fk_parent1'].queryset = parents.filter(sex="Masculin")
Bform.fields['fk_parent2'].queryset = parents.filter(sex="Feminin")
if Bform.is_valid() : # Vérification sur la validité des données
if '_save2' in request.POST :
post = Bform.save()
return HttpResponseRedirect(reverse('BC_treated', kwargs={'id': post.id}))
else:
Bform = BirthCertificateForm()
context = {
"Bform" : Bform,
"query_lastname" : query_lastname,
}
return render(request, 'BC_form.html', context)
但它似乎不起作用。我正在您的视图中搜索为什么^ ^,创建表单实例后,修改字段queryset:
parents = Identity.objects.filter(lastname=query_lastname)
form = BirthCertificateForm()
form.fields['fk_parent1'].queryset = parents.filter(sex="M")
form.fields['fk_parent2'].queryset = parents.filter(sex="F")
不需要使用上下文处理器或缓存
修复后(和某些样式):
如果我理解,您希望选择列表
$(“id\u fk\u parent1”)
和$(“id\u fk\u parent2”)
在$(“id\u lastname”)
更改时被更改。您必须使用由$(“id\u lastname”)触发的ajax调用来执行此操作。on(“更改”,函数(…)
。为了更清晰,我将完全编辑我的帖子!您缺少一个请求。帖子
:Bform=BirthCertificateForm(request.post)
!我可能很傻(或很累),但是:我在BirthCertificateForm()
中添加了请求。以前我有BirthCertificateForm(request.post或无)
。我有两个Bform
,因为我有if/else
条件。我必须从forms.py文件中删除fk\u parent1=CustomLabelModelChoiceField
?然后,它仍然显示所有行,而不考虑queryset
。您可以在您的答案中发布整个视图函数并进行修改吗?我编辑用你的答案回答我的问题,但到目前为止,我无法从用户请求中过滤fk_parent
。获取。你的代码中出现了两次Bform=BirthCertificateForm()
。你将不得不处理这两次。我编辑了你的答案,并添加了效果很好的解决方案;)谢谢!昨天我很累,今天我明白了你说的;)这个链接帮助我理解:你的编辑有什么好处?只是两个功能分开?小心,我必须为两个父母指定两个姓氏;)