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有时会返回一个元组