使ManyToMany Model的所有字段都以表单形式出现

时间:2017-12-03 12:31:25

标签: python django forms many-to-many

我是编码新手,我的第一个项目我决定使用Django。

我正在编写一个Web应用程序,通过填写创建pdf文档的表单(规范表),用户可以非常轻松地创建规范表。我的主要模型是" Fiches",我有m2m链接到我的其他模型,每个模型可以包含1个或几个属性。我的所有代码都在下面。

model.py(未完成参数设置,只是为了使用某些东西)

- - 编码:utf-8 - -

cos(theta) = 1 - 1/2*(d/r)^2

theta = arccos(1 - 1/2*(d/r)^2)

forms.py

    from django.db import models
    from django.conf import settings
    from django.utils import timezone


    class Utilisateurs(models.Model):
        nom = models.CharField(max_length=200)
        prenom = models.CharField(max_length=200)
        pays = models.CharField(max_length=200)


    class Calibres(models.Model):
        calibre = models.CharField(max_length=200)
        tolerance = models.CharField(max_length=200)


    class Additifs(models.Model):
        denomination_FR = models.CharField(max_length=200)
        denomination_EN = models.CharField(max_length=200)
        denomination_ES = models.CharField(max_length=200)


    class Ingredients(models.Model):
        denomination_FR = models.CharField(max_length=200)
        denomination_EN = models.CharField(max_length=200)
        denomination_ES = models.CharField(max_length=200)


    class Formes(models.Model):
        denomination_FR = models.CharField(max_length=200)
        Denomination_EN = models.CharField(max_length=200)
        Denomination_ES = models.CharField(max_length=200)


    class DimensionsProduit(models.Model):
        denomination_FR = models.CharField(max_length=200)
        denomination_EN = models.CharField(max_length=200)
        denomination_ES = models.CharField(max_length=200)
        Valeur = models.CharField(max_length=200)


    class Conditionnements(models.Model):
        primSec_FR = models.CharField(max_length=200)
        primSec_EN = models.CharField(max_length=200)
        primSec_ES = models.CharField(max_length=200)
        nature_FR = models.CharField(max_length=200)
        nature_EN = models.CharField(max_length=200)
        nature_ES = models.CharField(max_length=200)
        compose_FR = models.CharField(max_length=200)
        compose_EN = models.CharField(max_length=200)
        compose_ES = models.CharField(max_length=200)
        couleur_FR = models.CharField(max_length=200)
        couleur_EN = models.CharField(max_length=200)
        couleur_ES = models.CharField(max_length=200)


    class DimensionsConditionnement(models.Model):
        Denomination_FR = models.CharField(max_length=200)
        Denomination_EN = models.CharField(max_length=200)
        Denomination_ES = models.CharField(max_length=200)
        Valeur = models.CharField(max_length=200)


    class CriteresOrganoleptiques(models.Model):
        cru_Cuit_FR = models.CharField(max_length=200)
        cru_Cuit_EN = models.CharField(max_length=200)
        cru_Cuit_ES = models.CharField(max_length=200)
        denomination_FR = models.CharField(max_length=200)
        denomination_EN = models.CharField(max_length=200)
        denomination_ES = models.CharField(max_length=200)
        description_FR = models.CharField(max_length=200)
        description_EN = models.CharField(max_length=200)
        description_ES = models.CharField(max_length=200)


    class CriteresPhysiques(models.Model):
        denomination_FR = models.CharField(max_length=200)
        denomination_EN = models.CharField(max_length=200)
        denomination_ES = models.CharField(max_length=200)
        norme_FR = models.CharField(max_length=200)
        norme_EN = models.CharField(max_length=200)
        norme_ES = models.CharField(max_length=200)
        tolerance_FR = models.CharField(max_length=200)
        tolerance_EN = models.CharField(max_length=200)
        tolerance_ES = models.CharField(max_length=200)


    class CriteresMicrobiologiques(models.Model):
        denomination_FR = models.CharField(max_length=200)
        denomination_EN = models.CharField(max_length=200)
        denomination_ES = models.CharField(max_length=200)
        norme = models.CharField(max_length=200)


    class CriteresChimiques(models.Model):
        denomination_FR = models.CharField(max_length=200)
        denomination_EN = models.CharField(max_length=200)
        denomination_ES = models.CharField(max_length=200)
        norme = models.CharField(max_length=200)


    class CriteresNutritionnels(models.Model):
        denomination_FR = models.CharField(max_length=200)
        denomination_EN = models.CharField(max_length=200)
        denomination_ES = models.CharField(max_length=200)
        valeur = models.CharField(max_length=200)
        unite = models.CharField(max_length=200)


    class Photos(models.Model):
        denomination_FR = models.CharField(max_length=200)
        denomination_EN = models.CharField(max_length=200)
        denomination_ES = models.CharField(max_length=200)
        image = models.CharField(max_length=200)


    class AutresCaracteristiques(models.Model):
        denomination_FR = models.CharField(max_length=200)
        denomination_EN = models.CharField(max_length=200)
        denomination_ES = models.CharField(max_length=200)
        detail_FR = models.CharField(max_length=200)
        detail_EN = models.CharField(max_length=200)
        detail_ES = models.CharField(max_length=200)


    class Fiches(models.Model):
        utilisateurs = models.ForeignKey(Utilisateurs)
        type = models.CharField(max_length=200)
        code = models.CharField(max_length=200)
        auteur = models.CharField(max_length=200)
        suivi_des_modifications = models.CharField(max_length=200)
        date_de_creation = models.CharField(max_length=200)
        famille_FR = models.CharField(max_length=200)
        famille_EN = models.CharField(max_length=200)
        famille_ES = models.CharField(max_length=200)
        genre_FR = models.CharField(max_length=200)
        genre_EN = models.CharField(max_length=200)
        genre_ES = models.CharField(max_length=200)
        espece_FR = models.CharField(max_length=200)
        espece_EN = models.CharField(max_length=200)
        espece_ES = models.CharField(max_length=200)
        type_production_FR = models.CharField(max_length=200)
        type_production_EN = models.CharField(max_length=200)
        type_production_ES = models.CharField(max_length=200)
        pays_origine_FR = models.CharField(max_length=200)
        pays_origine_EN = models.CharField(max_length=200)
        pays_origine_ES = models.CharField(max_length=200)
        zone_fao = models.CharField(max_length=200)
        technique_peche_FR = models.CharField(max_length=200)
        technique_peche_EN = models.CharField(max_length=200)
        technique_peche_ES = models.CharField(max_length=200)
        pays_transformation_FR = models.CharField(max_length=200)
        pays_transformation_EN = models.CharField(max_length=200)
        pays_transformation_ES = models.CharField(max_length=200)
        numero_agrement = models.CharField(max_length=200)
        ville_transformation_FR = models.CharField(max_length=200)
        ville_transformation_EN = models.CharField(max_length=200)
        ville_transformation_ES = models.CharField(max_length=200)
        process_transformation_FR = models.CharField(max_length=200)
        process_transformation_EN = models.CharField(max_length=200)
        process_transformation_ES = models.CharField(max_length=200)
        type_congelation = models.CharField(max_length=200)
        taux_glazing = models.CharField(max_length=200)
        tolerance_taux_glazing = models.CharField(max_length=200)
        compensation_glazing_FR = models.CharField(max_length=200)
        compensation_glazing_EN = models.CharField(max_length=200)
        compensation_glazing_ES = models.CharField(max_length=200)
        cru_cuit_FR = models.CharField(max_length=200)
        cru_cuit_EN = models.CharField(max_length=200)
        cru_cuit_ES = models.CharField(max_length=200)
        dluo = models.CharField(max_length=200)
        poids_brut_par_carton = models.CharField(max_length=200)
        poids_net_par_carton = models.CharField(max_length=200)
        palletisation = models.CharField(max_length=200)
        calibres = models.ManyToManyField(Calibres)
        additifs = models.ManyToManyField(Additifs)
        ingredients = models.ManyToManyField(Ingredients)
        formes = models.ManyToManyField(Formes)
        dimensions_produit = models.ManyToManyField(DimensionsProduit)
        conditionnements = models.ManyToManyField(Conditionnements)
        dimensions_conditionnement = models.ManyToManyField(DimensionsConditionnement)
        criteres_organoleptiques = models.ManyToManyField(CriteresOrganoleptiques)
        criteres_physiques = models.ManyToManyField(CriteresPhysiques)
        criteres_microbiologiques = models.ManyToManyField(CriteresMicrobiologiques)
        criteres_chimiques = models.ManyToManyField(CriteresChimiques)
        criteres_nutritionnels = models.ManyToManyField(CriteresNutritionnels)
        photos = models.ManyToManyField(Photos)
        autres_caracteristiques = models.ManyToManyField(AutresCaracteristiques)

        def __str__(self):
            return self.code

views.py

    from django.forms import ModelForm
    from . import models
    from django import forms

    class FichesForm(ModelForm):

        class Meta:
            model = models.Fiches
            fields = '__all__'

有两件事经过数小时的研究和测试后,我无法找到该怎么做:

1 / ManyToMany链接在我的表单中自动显示1个ModelMultipleChoiceField,但它不是我希望它们出现的方式。由于用户每次创建新文档时都必须完成所有字段,因此我需要所有模型的所有属性都显示在我的表单中,包括ManyToMany字段之一。

2 /对于我的表单的几乎所有字段,我都希望有一个下拉列表,而不是一个简单的文本框,用户也可以增加一个下拉列表(如果信息不在drop中)在列表中,他可以通过在文本框中发短信将其添加到数据库中,并且可以在下拉列表中创建下一个工作表。我一直在阅读关于小部件但我不确定如何使用它们以及它们是否适合我的情况。

我在forms.py上尝试了这个(花了#34; Calibres"作为一个例子来尝试,它是m2m之一)但它没有工作:

from django.shortcuts import render, redirect, get_object_or_404
from .forms import FichesForm
from django.utils import timezone
from FSE.convPDF import render_to_pdf
from .models import Fiches
from django.http import HttpResponseBadRequest


def fichepdffr(request, pk):

    nouvelle_fiche_pdf = get_object_or_404(Fiches, pk=pk)
    return render_to_pdf('fichepdf_fr.html', {'nouvelle_fiche_pdf':nouvelle_fiche_pdf})


def creaft(request):
    if request.method == "POST":
        form = FichesForm(request.POST)
        if form.is_valid():
            print("info valid")

            nouvelle_fiche = form.save(commit=False)
            nouvelle_fiche.save()
            form.save_m2m()

            return redirect('fichepdffr', pk=nouvelle_fiche.pk)
        return HttpResponseBadRequest()

    else:
        form = FichesForm()

    return render(
        request, "formulaire.html", {
            'form': form})

抱歉,我的代码是法语,没有反映用英语编码。将来会有!

如果您需要任何其他信息来了解我的问题,请不要犹豫告诉我:)

非常感谢你的帮助。

0 个答案:

没有答案