Django 错误:hasattr():属性名称必须是字符串

Ess*_*sex 1 python django

我收到 Django/Pythonic 错误,但我不知道如何解决它。我尝试了很多方法,但到目前为止错误仍然存​​在。

\n\n

我的错误是:

\n\n
\n

hasattr():属性名称必须是字符串

\n
\n\n

这个错误来自我的 Django 表单。当我点击验证表单时,我遇到了这个问题。

\n\n

我的models.py 文件如下所示:

\n\n
class Individu(models.Model):\n\n    NumeroIdentification = models.CharField(max_length=30, null=True, verbose_name=\'Num\xc3\xa9ro Identification physique\', unique=True)\n    Civilite = models.CharField(max_length=12,choices=CHOIX_TITRE, verbose_name=\'Civilit\xc3\xa9\')\n    NomJeuneFille = models.CharField(max_length=30, verbose_name=\'Nom de jeune fille\', blank=True)\n    Nom = models.CharField(max_length=30, verbose_name=\'Nom de famille\')\n    Prenom = models.CharField(max_length=30, verbose_name=\'Pr\xc3\xa9nom(s)\')\n    Sexe = models.CharField(max_length=30, choices=CHOIX_SEXE, verbose_name=\'Sexe\')\n    Statut = models.CharField(max_length=30, choices=CHOIX_STATUT, verbose_name="Statut civil")\n    DateNaissance = models.DateField(verbose_name=\'Date de naissance\')\n    VilleNaissance = models.CharField(max_length=30, verbose_name=\'Ville de naissance\')\n    PaysNaissance = CountryField(blank_label=\'S\xc3\xa9lectionner un pays\', verbose_name=\'Pays de naissance\')\n    Nationalite1 = models.CharField(max_length=30, verbose_name=\'Nationalit\xc3\xa9 1\')\n    Nationalite2 = models.CharField(max_length=30, verbose_name=\'Nationalit\xc3\xa9 2\', null=True, blank=True)\n    Profession = models.CharField(max_length=30, verbose_name=\'Profession\')\n    Adresse = models.CharField(max_length=30, verbose_name=\'Adresse\')\n    Ville = models.CharField(max_length=30, verbose_name=\'Ville\')\n    Zip = models.IntegerField(verbose_name=\'Code Postal\')\n    Pays = CountryField(blank_label=\'S\xc3\xa9lectionner un pays\', verbose_name=\'Pays\')\n    Mail = models.CharField(max_length=30, verbose_name=\'Email\', blank=True)\n    Telephone = models.CharField(max_length=20, verbose_name=\'T\xc3\xa9l\xc3\xa9phone\', blank=True)\n    Creation = models.DateTimeField(auto_now_add=True)\n    InformationsInstitution = models.CharField(max_length=30, null=False, verbose_name=\'Informations Institution\')\n    Utilisateur = models.CharField(max_length=100, null=False, verbose_name="Utilisateur", default=" ")\n    Etat = models.CharField(max_length=30, choices=CHOIX_ETAT, default=" ", null=False, verbose_name="Etat")\n\n    def save(self, *args, **kwargs):\n        for field_name in [\'NomJeuneFille\' ,\'Nom\', \'VilleNaissance\', \'Nationalite1\', \'Nationalite2\', \'Ville\', \'Profession\']:\n            val = getattr(self, field_name, False)\n            if val:\n                setattr(self, field_name, val.upper())\n\n        for field_name in [\'Prenom\']:\n            val = getattr(self, field_name, False)\n            if val:\n                new_val = []\n                words = val.split()\n                for x in words:\n                    x = x.capitalize()\n                    new_val.append(x)\n                val = " ".join(new_val)\n                setattr(self, field_name, val.capitalize())\n\n        super(Individu, self).save(*args, **kwargs)\n\n\n    def __unicode__(self):\n        return \'%s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s\' % (self.id, self.NumeroIdentification, self.Civilite, self.NomJeuneFille ,self.Nom, self.Statut, self.Prenom, \n                                                                            self.Sexe, self.DateNaissance, self.VilleNaissance, self.PaysNaissance, self.Nationalite1, self.Nationalite2, \n                                                                            self.Profession, self.Adresse, self.Ville, self.Zip, self.Pays, self.Mail, self.Telephone, self.Etat, self.InformationsInstitution)\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后,我有我的form.py 文件:

\n\n
class IndividuFormulaire(forms.ModelForm) :\n\n    InformationsInstitution = forms.CharField(widget=forms.HiddenInput(), initial=InformationsInstitution.objects.last().Ville.encode(\'utf-8\'))\n    Utilisateur = forms.CharField(widget=forms.HiddenInput())\n\n    class Meta :\n        model = Individu\n        fields = [\n                \'Etat\', \n                \'Utilisateur\', \n                \'Civilite\', \n                \'NomJeuneFille\',\n                \'Prenom\', \n                \'Nom\', \n                \'Statut\', \n                \'Sexe\', \n                \'DateNaissance\', \n                \'VilleNaissance\', \n                \'PaysNaissance\', \n                \'Nationalite1\', \n                \'Nationalite2\',\n                \'Profession\', \n                \'Adresse\', \n                \'Ville\', \n                \'Zip\', \n                \'Pays\', \n                \'Mail\', \n                \'Telephone\', \n                \'InformationsInstitution\',]\n
Run Code Online (Sandbox Code Playgroud)\n\n

我的views.py函数:

\n\n
@login_required\ndef Identity_Individu_Form(request) :\n\n    success = False\n\n    if request.method == \'POST\':\n\n        form = IndividuFormulaire(request.POST or None)\n\n        if form.is_valid() :  \n            post = form.save()\n            messages.success(request, \'Le formulaire a \xc3\xa9t\xc3\xa9 enregistr\xc3\xa9 !\')\n            return HttpResponseRedirect(reverse(\'IndividuResume\', kwargs={\'id\': post.id}))\n\n        else:\n            messages.error(request, "Le formulaire est invalide !")\n\n    else:\n        form = IndividuFormulaire()\n        form.fields[\'Utilisateur\'].initial = request.user.last_name + " " + request.user.first_name\n    return render(request, \'Identity_Individu_Form.html\', {"form" : form})\n
Run Code Online (Sandbox Code Playgroud)\n\n

数据库有一个特殊性。我使用它是Django routers因为我需要将表单结果保存在多个数据库中,正如您在这张图片中看到的那样。我必须将其保存在DS_CORE.Identity_individu和中DS_PUBLIC.Identity_individu。

\n\n

在此输入图像描述

\n\n

所以我的GlobalRouter.py 文件中有:

\n\n
class GlobalRouter(object):\n    """\nA router to control all database operations on models in the\nauth application.\n"""\n\n    def db_for_read(self, model, **hints):\n        """\n        Attempts to read auth models go to auth.\n        """\n        app_list = (\'Identity\')\n\n        if model._meta.app_label in app_list:\n            return \'default\'\n        return None\n\n    def db_for_write(self, model, **hints):\n        """\n        Attempts to write auth models go to auth.\n        """\n        app_list = (\'Identity\')\n        if model._meta.app_label in app_list:\n            return (\'DS_Public\',\'default\')\n        return None\n\n    def allow_relation(self, obj1, obj2, **hints):\n        """\n        Allow relations if a model in the auth app is involved.\n        """\n        app_list = (\'Identity\')\n        if obj1._meta.app_label in app_list and obj2._meta.app_label in app_list:\n            return True\n        return None\n\n    def allow_migrate(self, db, app_label, model=None, **hints):\n        """\n        Make sure the auth app only appears in the \'auth\'\n        database.\n        """\n        app_list = (\'Identity\')\n\n        if app_label in app_list:\n            return db == (\'DS_Public\',\'default\')\n        return None\n
Run Code Online (Sandbox Code Playgroud)\n\n

我没有找到错误所在。我正在加入完整的回溯:

\n\n
Environment:\n\n\nRequest Method: POST\nRequest URL: http://localhost:8000/Identity/Formulaire/Individus\n\nDjango Version: 1.10.3\nPython Version: 2.7.12\nInstalled Applications:\n[\'Informations\',\n \'django.contrib.admin\',\n \'django.contrib.auth\',\n \'django.contrib.contenttypes\',\n \'django.contrib.sessions\',\n \'django.contrib.messages\',\n \'django.contrib.staticfiles\',\n \'bootstrapform\',\n \'django_countries\',\n \'debug_toolbar\',\n \'chartit\',\n \'Configurations\',\n \'Accueil\',\n \'log\',\n \'Identity\']\nInstalled Middleware:\n[\'django.contrib.sessions.middleware.SessionMiddleware\',\n \'django.middleware.locale.LocaleMiddleware\',\n \'django.middleware.common.CommonMiddleware\',\n \'django.middleware.csrf.CsrfViewMiddleware\',\n \'django.middleware.gzip.GZipMiddleware\',\n \'django.contrib.auth.middleware.AuthenticationMiddleware\',\n \'django.contrib.auth.middleware.SessionAuthenticationMiddleware\',\n \'django.contrib.messages.middleware.MessageMiddleware\',\n \'django.middleware.clickjacking.XFrameOptionsMiddleware\',\n \'django.middleware.security.SecurityMiddleware\',\n \'debug_toolbar.middleware.DebugToolbarMiddleware\']\n\n\n\nTraceback:\n\nFile "/usr/local/lib/python2.7/site-packages/django/core/handlers/exception.py" in inner\n  39.             response = get_response(request)\n\nFile "/usr/local/lib/python2.7/site-packages/django/core/handlers/base.py" in _legacy_get_response\n  249.             response = self._get_response(request)\n\nFile "/usr/local/lib/python2.7/site-packages/django/core/handlers/base.py" in _get_response\n  187.                 response = self.process_exception_by_middleware(e, request)\n\nFile "/usr/local/lib/python2.7/site-packages/django/core/handlers/base.py" in _get_response\n  185.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)\n\nFile "/usr/local/lib/python2.7/site-packages/django/contrib/auth/decorators.py" in _wrapped_view\n  23.                 return view_func(request, *args, **kwargs)\n\nFile "/Users/valentinjungbluth/Desktop/Django/DatasystemsCORE/DatasystemsCORE/Identity/views.py" in Identity_Individu_Form\n  140.             post = form.save()\n\nFile "/usr/local/lib/python2.7/site-packages/django/forms/models.py" in save\n  453.             self.instance.save()\n\nFile "/Users/valentinjungbluth/Desktop/Django/DatasystemsCORE/DatasystemsCORE/Identity/models.py" in save\n  116.         super(Individu, self).save(*args, **kwargs)\n\nFile "/usr/local/lib/python2.7/site-packages/django/db/models/base.py" in save\n  796.                        force_update=force_update, update_fields=update_fields)\n\nFile "/usr/local/lib/python2.7/site-packages/django/db/models/base.py" in save_base\n  821.         with transaction.atomic(using=using, savepoint=False):\n\nFile "/usr/local/lib/python2.7/site-packages/django/db/transaction.py" in __enter__\n  152.         connection = get_connection(self.using)\n\nFile "/usr/local/lib/python2.7/site-packages/django/db/transaction.py" in get_connection\n  21.     return connections[using]\n\nFile "/usr/local/lib/python2.7/site-packages/django/db/utils.py" in __getitem__\n  205.         if hasattr(self._connections, alias):\n\nException Type: TypeError at /Identity/Formulaire/Individus\nException Value: hasattr(): attribute name must be string\n
Run Code Online (Sandbox Code Playgroud)\n

Seb*_*bin 5

db_for_write并且db_for_read应该返回与连接别名相对应的字符串。在你的情况下,db_for_write有时会返回一个元组