使用基于类的视图预填充 Django 表单

Ess*_*sex 1 django django-class-based-views

由于我正在学习 Django Class Based View(CBV) 以处理在Function Based View(FBV) 中开发的脚本,我想进行以下过程。

\n\n

我想预填充一个基于self.request.GET.

\n\n

这是我的课:

\n\n
class IdentitySocieteFormView(LoginRequiredMixin, CreateView) :\n\n    form_class = SocieteFormulaire\n    template_name = \'Identity_Societe_Form.html\'\n    model = Societe\n\n    def get_context_data(self, **kwargs) :\n\n        data = super(IdentitySocieteFormView, self).get_context_data(**kwargs)\n\n        if \'recherche\' in self.request.GET :\n\n            query_Responsable = self.request.GET.get(\'Responsable\') \n            Responsable = Individu.objects.filter(NumeroIdentification=query_Responsable)\n\n            data[\'responsable\'] = Responsable\n\n        return data\n\n    def form_valid(self, form) :\n\n        form.instance.Reponsable = responsable\n        form.instance.Utilisateur = self.request.user.last_name + " " + self.request.user.first_name\n\n        return super(IdentitySocieteFormView, self).form_valid(form)\n
Run Code Online (Sandbox Code Playgroud)\n\n

但我不确定这一行:form.instance.Reponsable = responsable它可以重新填充我的字段。

\n\n

以前,我的脚本如下所示:

\n\n
@login_required\ndef IdentitySocieteForm(request) :\n\n    query_Responsable = request.GET.get(\'Responsable\') \n\n    success = False\n\n    if request.method == \'POST\':\n\n        form = SocieteFormulaire(request.POST or None)\n\n        if form.is_valid() :   # V\xc3\xa9rification sur la validit\xc3\xa9 des donn\xc3\xa9es\n            post = form.save()\n\n            messages.success(request, \'Le formulaire a \xc3\xa9t\xc3\xa9 enregistr\xc3\xa9 !\')\n            return HttpResponseRedirect(reverse(\'SocieteResume\', kwargs={\'id\': post.id}))\n\n        else:\n            messages.error(request, "Le formulaire est invalide !")\n\n    else:\n        form = SocieteFormulaire()\n\n        Responsable = Individu.objects.filter(NumeroIdentification=query_Responsable)\n        form.fields[\'Responsable\'].queryset = Responsable\n        form.fields[\'Utilisateur\'].initial = request.user.last_name + " " + request.user.first_name\n\n    return render(request, \'Identity_Societe_Form.html\', {"form" : form, "query_Responsable" : query_Responsable})\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果您能帮助我,请提前致谢

\n\n

编辑 :

\n\n

我试过get_initial()

\n\n
def get_initial(self):\n\n        initial = super(IdentitySocieteFormView, self).get_initial()\n\n        if \'recherche\' in self.request.GET :\n\n            query_Responsable = self.request.GET.get(\'Responsable\')\n            Responsable = Individu.objects.filter(NumeroIdentification=query_Responsable)\n            initial[\'Responsable\'].queryset = Responsable\n\n        return initial\n
Run Code Online (Sandbox Code Playgroud)\n\n

但我得到:

\n\n
File "/Users/valentinjungbluth/Desktop/Django/DatasystemsCORE/DatasystemsCore/DatasystemsCORE/Identity/views.py" in get_initial\n  227.             initial[\'Responsable\'].queryset = Responsable\n\nException Type: KeyError at /Identification/Company/Form/\nException Value: \'Responsable\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

我的 forms.py 看起来像这样:

\n\n
class SocieteFormulaire(forms.ModelForm) :\n\n    Responsable = CustomLabelModelChoiceField(Individu.objects.filter(), required=False, label = "Responsable", label_func=lambda obj: \'%s %s %s\' % (obj.Nom, obj.Prenom, obj.NumeroIdentification))\n    InformationsInstitution = forms.CharField(widget=forms.HiddenInput(), initial=InformationsInstitution.objects.using(\'default\').last().Ville.encode(\'utf-8\'))\n\n    class Meta :\n        model = Societe\n        fields = [\n                \'Nom\',\n                \'Etat\', \n                \'Adresse\', \n                \'Ville\', \n                \'Zip\', \n                \'Region\',\n                \'Pays\', \n                \'Mail\',\n                \'Web\',\n                \'Telephone\',\n                \'Fax\',\n                \'SIREN\',\n                \'SIRET\',\n                \'NAF_APE\',\n                \'RCS\',\n                \'CHOIX_TVA\',\n                \'TVA\',\n                \'Type\',\n                \'Effectif\',\n                \'Domaine\', \n                \'Capital\',\n                \'Responsable\',\n                \'InformationsInstitution\',]\n
Run Code Online (Sandbox Code Playgroud)\n

小智 5

接下来是使用get-queryset 过滤 a-createview-in-a-model-in-a-createview-with-get-queryset

更新get_form_kwargs方法

def get_form_kwargs(self):
    kwargs = super(IdentitySocieteFormView, self).get_form_kwargs()
    query_Responsable = self.request.GET.get('Responsable')
    Responsable = Individu.objects.filter(NumeroIdentification=query_Responsable)
    kwargs['responsable_qs'] = Responsable
    u = request.user
    kwargs['user_initial'] = '{lname} {fname}'.format(lname=u.last_name, fname=u.first_name)
    return kwargs
Run Code Online (Sandbox Code Playgroud)

通知

class SocieteFormulaire(forms.ModelForm):
    def __init__(self, *args, **kwargs):
       user_initial = kwargs.pop('user_initial', None)
       responsable_qs = kwargs.pop('responsable_qs', None)
       super(SocieteFormulaire, self).__init__(*args, **kwargs)
       self.fields['Responsable'].queryset = responsable_qs
       self.fields['InformationsInstitution'].initial = user_initial
Run Code Online (Sandbox Code Playgroud)