Django:如何在基于类的视图中定义表单? ->错误无法分配“ ..”“ ..”必须是“ Utilisateur”实例]] << [

问题描述 投票:0回答:1
我已经发布(请参阅下面的链接)以“有效”我的ER图。

[我尝试使用嵌套的inlineformset开发基于'trought'模型的表单。

当我在UtilisateurCreateView类中定义字段但我想自定义'trought'父级表单以能够:时,它可以工作:

    设置初始pro_ide值并使用GET发送的值
  1. 隐藏此pro_ide字段
  2. 自定义uti_ide字段标签
  3. 所以我像过去那样基于'throught'模型定义UtilisateurProjetCreateForm,但出现错误:

无法分配“'Slater,Kelly([email protected])'”:“ UtilisateurProjet.uti_ide”必须是“ Utilisateur”实例。

此外,由于此表单基于'throught'模型,因此我不确定是否应该定义form.ChoiceField ...

models.py

class Projet(SafeDeleteModel): _safedelete_policy = SOFT_DELETE_CASCADE pro_ide = models.AutoField(primary_key = True) # utilisateurs = models.ManyToManyField(Utilisateur, through='UtilisateurProjet') pro_nom = models.IntegerField("Nom du projet") pro_log = models.CharField("Log utiisateur", max_length=20, null=True, blank=True) pro_dat = models.DateTimeField("Date log",auto_now_add=True) pro_act = models.IntegerField("Projet en cours ?", null=True, blank=True) class Meta: db_table = 'tbl_pro' verbose_name_plural = 'Projets' ordering = ['pro_ide'] permissions = [ ('can_add_project','Can add project'), ] def __str__(self): return f"{self.pro_nom}" class Utilisateur(SafeDeleteModel): _safedelete_policy = SOFT_DELETE_CASCADE uti_ide = models.AutoField(primary_key = True) # pro_ide = models.ForeignKey(Projet, on_delete = models.CASCADE) # related project projets = models.ManyToManyField(Projet, through='UtilisateurProjet') uti_nom = models.CharField("Nom", max_length=20) uti_pre = models.CharField("Prénom", max_length=20) uti_mai = models.CharField("Email", max_length=40) uti_sit = models.CharField("Equipe", max_length=20, null=True, blank=True) uti_pro = models.CharField("Fonction/profil", max_length=200, null=True, blank=True) uti_dem_dat = models.DateTimeField("Date demande",auto_now_add=True, null=True, blank=True) uti_val = models.IntegerField("Demande validée ?", null=True, blank=True) uti_val_dat = models.DateTimeField("Date validation",null=True, blank=True) uti_log = models.CharField("Log utilisateur", max_length=20, null=True, blank=True) uti_dat = models.DateTimeField("Date log",auto_now_add=True, null=True, blank=True) class Meta: db_table = 'tbl_uti' verbose_name_plural = 'Utilisateurs' ordering = ['uti_ide'] def __str__(self): return f"{self.uti_nom}, {self.uti_pre} ({self.uti_mai})" class UtilisateurProjet(models.Model): _safedelete_policy = SOFT_DELETE_CASCADE pro_uti_ide = models.AutoField(primary_key = True) uti_ide = models.ForeignKey(Utilisateur, on_delete=models.CASCADE) pro_ide = models.ForeignKey(Projet, on_delete=models.CASCADE) class Meta: db_table = 'tbl_pro_uti' class Application(SafeDeleteModel): _safedelete_policy = SOFT_DELETE_CASCADE app_ide = models.AutoField(primary_key = True) # uti_ide = models.ForeignKey(Utilisateur, on_delete = models.CASCADE) # related utilisateur pro_uti_ide = models.ForeignKey(UtilisateurProjet, on_delete = models.CASCADE) # related utilisateur-projet app_app_nom = models.IntegerField("Nom application", null=True, blank=True) app_dro = models.IntegerField("Droit sur application", null=True, blank=True) app_sta = models.IntegerField("Statut (création/Modification/Suppression", null=True, blank=True) app_log = models.CharField("Log utilisateur", max_length=20, null=True, blank=True) app_dat = models.DateTimeField("Date log",auto_now_add=True, null=True, blank=True) class Meta: db_table = 'tbl_app' verbose_name_plural = 'Applications' ordering = ['app_ide']

views.py

# https://stackoverflow.com/questions/29981690/django-form-validation-on-class-based-view class UtilisateurCreateView(FormView): template_name = 'project/utilisateurprojet_form.html' form_class = UtilisateurProjetCreateForm def get_context_data(self, **kwargs): data = super().get_context_data(**kwargs) if self.request.POST: data["utilisateur"] = self.request.user.username # nom de l'utilisateur connecté data["projet"] = get_object_or_404(Projet, pro_ide = self.request.GET['projet']) data["application"] = ApplicationFormset(self.request.POST) else: data["application"] = ApplicationFormset() return data def form_valid(self, form): context = self.get_context_data() application = context["application"] self.object = form.save(commit=False) self.object.uti_log = context["utilisateur"] self.object.save() if application.is_valid(): application.instance = self.object application.save() return super().form_valid(form) def get_success_url(self): return reverse("project:index")

forms.py

ApplicationFormset = inlineformset_factory( UtilisateurProjet, Application, fields=('app_app_nom','app_dro'), widgets={ 'app_app_nom': forms.Select(choices=NAME), 'app_dro': forms.Select(choices=ACCESS) }, extra=3, can_delete=True, ) class UtilisateurProjetCreateForm(forms.ModelForm): PROJETS = [(Projet.objects.get(pro_ide=1),'Coverage Africa'),] UTILISATEURS = [(Utilisateur.objects.get(uti_ide=1),'Slater'),] pro_ide = forms.ChoiceField(label = "Nom projet", widget = forms.Select, choices = PROJETS, initial = Projet.objects.get(pro_ide=1), disabled=True) uti_ide = forms.ChoiceField(label = "Nom, prénom de l'utilisateur", widget = forms.Select, choices = UTILISATEURS) class Meta: model = UtilisateurProjet fields = ('pro_ide','uti_ide')
related post

我已经发布(请参阅下面的链接)以“有效”我的ER图。我尝试开发基于带有嵌套inlineformset的“交易”模型的表单。当我在...

django forms manytomanyfield
1个回答
0
投票
我必须在我的ModelForm中使用ModelChoiceFiled:
© www.soinside.com 2019 - 2024. All rights reserved.