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变量
没有出现在我的筛选条件中

我有一个型号(
出生证
),根据另一个型号(
身份
)有两个外国钥匙

  • 身份:此模型包含有关城镇居民的所有信息(姓、名等)

  • 出生证:此模型包含有关新子女的所有信息以及来自身份模型的家长信息

当我同时显示两个ForeignKey选项字段时,列表非常长,我希望按如下方式过滤此ForeignKey:

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))
但是,查询筛选器不适用于my
VarLastname
。我得到一张空名单

如果我替换:

CustomLabelModelChoiceField(Identity.objects.filter(lastname=cached\u查询)
by
CustomLabelModelChoiceField(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()
。你将不得不处理这两次。我编辑了你的答案,并添加了效果很好的解决方案;)谢谢!昨天我很累,今天我明白了你说的;)这个链接帮助我理解:你的编辑有什么好处?只是两个功能分开?小心,我必须为两个父母指定两个
姓氏;)