简体   繁体   English

Django错误:预期的字符串或缓冲区

[英]Django error : Expected string or buffer

I'm getting a Django error : expected string or buffer when I submit my Django form. 我收到Django错误:提交Django表单时出现expected string or buffer I already read some SO questions according to the same problem but it doesn't seem to work. 我已经根据相同的问题阅读了一些SO问题,但似乎不起作用。

This is my models.py form : 这是我的models.py表格:

class BirthCertificate(models.Model):

    lastname = models.CharField(max_length=30, null=False, verbose_name='Nom de famille')
    firstname = models.CharField(max_length=30, null=False, verbose_name='Prénom(s)')
    sex = models.CharField(max_length=8, choices=SEX_CHOICES, verbose_name='Sexe')
    birthday = models.DateField(null=False, verbose_name='Date de naissance')
    birthhour = models.TimeField(null=True, verbose_name='Heure de naissance')
    birthcity = models.CharField(max_length=30, null=False, verbose_name='Ville de naissance')
    birthcountry = CountryField(blank_label='Sélectionner un pays', verbose_name='Pays de naissance')
    fk_parent1 = models.ForeignKey(Person, related_name='ID_Parent1', verbose_name='ID parent1', null=False)
    fk_parent2 = models.ForeignKey(Person, related_name='ID_Parent2', verbose_name='ID parent2', null=False)
    mairie = models.CharField(max_length=30, null=False, verbose_name='Mairie')
    social_number = models.CharField(max_length=30, null=True, verbose_name='numero social', unique=True)
    created = models.DateTimeField(auto_now_add=True)

This is my forms.py : 这是我的forms.py:

class BirthCertificateForm2(forms.ModelForm):
    fk_parent1 = CustomLabelModelChoiceField(Person.objects.filter(), required=False, label = "Père", label_func=lambda obj: '%s %s %s' % (obj.lastname, obj.firstname, obj.social_number), empty_label=None)
    fk_parent2 = CustomLabelModelChoiceField(Person.objects.filter(), required=False, label = "Mère", label_func=lambda obj: '%s %s %s' % (obj.lastname, obj.firstname, obj.social_number), empty_label=None)
    lastname = CustomLabelModelChoiceField(Person.objects.filter(), required=False, label = "Nom", label_func=lambda obj: '%s' % (obj.lastname), empty_label=None)
    firstname = CustomLabelModelChoiceField(Person.objects.filter(), required=False, label = "Prénom", label_func=lambda obj: '%s' % (obj.firstname), empty_label=None)
    birthday = CustomLabelModelChoiceField(Person.objects.filter(), required=False, label = "Date de Naissance", label_func=lambda obj: '%s' % (obj.birthday), empty_label=None)
    birthcity = CustomLabelModelChoiceField(Person.objects.filter(), required=False, label = "Ville de Naissance", label_func=lambda obj: '%s' % (obj.birthcity), empty_label=None)
    sex = CustomLabelModelChoiceField(Person.objects.filter(), required=False, label = "Sexe", label_func=lambda obj: '%s' % (obj.sex), empty_label=None)
    birthcountry = CustomLabelModelChoiceField(Person.objects.filter(), required=False, label = "Pays de Naissance", label_func=lambda obj: '%s' % (obj.birthcountry), empty_label=None)
    mairie = forms.CharField(widget=forms.HiddenInput(), initial=Mairie.objects.get(id=1).city.encode('utf-8')) 
    social_number = forms.CharField(widget=forms.HiddenInput(),required=False)


    class Meta :
        model = BirthCertificate
        fields = ['lastname', 'firstname', 'sex', 'birthday', 'birthhour', 'birthcity', 'birthcountry','fk_parent1', 'fk_parent2', 'mairie', 'social_number']
        widgets = {'country': CountrySelectWidget()}

        def __init__(self, *args, **kwargs):    
            super(BirthCertificateForm2, self).__init__(*args, **kwargs)
            for key, value in self.fields.iteritems() :
                self.fields[key].widget.attrs.update({'class':'form-fields'})   

And finally my function in views.py : 最后是我在views.py中的功能:

def BirthCertificate_Form_unique_number(request) :

    #User fill some fields
    query_social_number = request.GET.get('social_number')
    query_social_number_father = request.GET.get('social_number_father')
    query_social_number_mother = request.GET.get('social_number_mother')

    if request.method == 'POST':

        form = BirthCertificateForm2(request.POST or None)

        if form.is_valid() :   # Vérification sur la validité des données
            post = form.save()
            return HttpResponseRedirect(reverse('BC_treated', kwargs={'id': post.id}))

    else:

        form = BirthCertificateForm2()

        parent1 = Person.objects.filter(social_number=query_social_number_father)
        parent2 = Person.objects.filter(social_number=query_social_number_mother)
        individu = Person.objects.filter(social_number=query_social_number)

        form = BirthCertificateForm2(request.POST or None)

        form.fields['fk_parent1'].queryset = parent1
        form.fields['fk_parent2'].queryset = parent2
        form.fields['lastname'].queryset = individu
        form.fields['firstname'].queryset = individu
        form.fields['birthday'].queryset = individu
        form.fields['birthcity'].queryset = individu
        form.fields['birthcountry'].queryset = individu
        form.fields['sex'].queryset = individu
        form.fields['social_number'].queryset = individu

        print request.POST

    context = {
        "form" : form,
    }

    return render(request, 'BC_form2.html', context)

My function lets to initially populate my BirthCertificate form with data from an other models. 我的函数允许首先使用其他模型的数据填充BirthCertificate表单。

But when I submit my form, I get the title error. 但是,当我提交表格时,出现标题错误。

This is the traceback : 这是回溯:

Environment:


Request Method: POST
Request URL: http://localhost:8000/BirthCertificate/formulaire2?social_number=1+87+10+STRASBOURG+-+583403&social_number_father=1+99+12+BREST+-+765533&social_number_mother=1+87+10+STRASBOURG+-+583403

Django Version: 1.10.3
Python Version: 2.7.12
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'BirthCertificate',
 'Identity',
 'bootstrapform',
 'Accueil',
 'django_countries',
 'log',
 'Mairie',
 'Table',
 'Recensement',
 'Configurations',
 'debug_toolbar',
 'chartit',
 'Mariage']
Installed Middleware:
['django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.locale.LocaleMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.middleware.gzip.GZipMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware',
 'django.middleware.security.SecurityMiddleware',
 'debug_toolbar.middleware.DebugToolbarMiddleware']



Traceback:

File "/usr/local/lib/python2.7/site-packages/django/core/handlers/exception.py" in inner
  39.             response = get_response(request)

File "/usr/local/lib/python2.7/site-packages/django/core/handlers/base.py" in _legacy_get_response
  249.             response = self._get_response(request)

File "/usr/local/lib/python2.7/site-packages/django/core/handlers/base.py" in _get_response
  187.                 response = self.process_exception_by_middleware(e, request)

File "/usr/local/lib/python2.7/site-packages/django/core/handlers/base.py" in _get_response
  185.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/Users/valentinjungbluth/Desktop/Django/Etat_civil/BirthCertificate/views.py" in BirthCertificate_Form_unique_number
  81.         if form.is_valid() :   # Vérification sur la validité des données

File "/usr/local/lib/python2.7/site-packages/django/forms/forms.py" in is_valid
  169.         return self.is_bound and not self.errors

File "/usr/local/lib/python2.7/site-packages/django/forms/forms.py" in errors
  161.             self.full_clean()

File "/usr/local/lib/python2.7/site-packages/django/forms/forms.py" in full_clean
  372.         self._post_clean()

File "/usr/local/lib/python2.7/site-packages/django/forms/models.py" in _post_clean
  398.             self.instance.full_clean(exclude=exclude, validate_unique=False)

File "/usr/local/lib/python2.7/site-packages/django/db/models/base.py" in full_clean
  1210.             self.clean_fields(exclude=exclude)

File "/usr/local/lib/python2.7/site-packages/django/db/models/base.py" in clean_fields
  1252.                 setattr(self, f.attname, f.clean(raw_value, self))

File "/usr/local/lib/python2.7/site-packages/django/db/models/fields/__init__.py" in clean
  590.         value = self.to_python(value)

File "/usr/local/lib/python2.7/site-packages/django/db/models/fields/__init__.py" in to_python
  1237.             parsed = parse_date(value)

File "/usr/local/lib/python2.7/site-packages/django/utils/dateparse.py" in parse_date
  60.     match = date_re.match(value)

Exception Type: TypeError at /BirthCertificate/formulaire2
Exception Value: expected string or buffer

EDIT : 编辑:

My CustomLabelModelChoiceField class looks like : 我的CustomLabelModelChoiceField类如下所示:

class CustomLabelModelChoiceField(forms.ModelChoiceField):

    def __init__(self, *args, **kwargs):
        self._label_from_instance = kwargs.pop('label_func', force_text)
        super(CustomLabelModelChoiceField, self).__init__(*args, **kwargs)

    def label_from_instance(self, obj):
        return self._label_from_instance(obj)

And my html file : 和我的html文件:

{% extends 'Base_BirthCertificate_Naissance.html' %}

{% load staticfiles %}

{% block title %}
    <h3> <span class="glyphicon glyphicon-file"></span>Acte de Naissance à partir d'un numéro unique</align> </h3>
{% endblock %}

{% block content %}

<style>

form > input {
    width:20%;
    }

    form {
        list-style: none;
    }

</style>

    <!-- ############### -->
    <!-- Page principale -->
    <!-- ############### -->

            <form class = "form" method="GET" action="">

                <h4> Numéro unique de l'individu : </h4>

                <input type="text"  name="social_number" placeholder="N° unique de l'individu" value="{{request.GET.social_number}}">&nbsp;

                <h4> Nom de famille du père et de la mère : </h4>

                <input type="text"  name="social_number_father" placeholder="N° unique du père" value="{{ request.GET.social_number_father }}">&nbsp;
                <input type="text"  name="social_number_mother" placeholder="N° unique de la mère" value="{{ request.GET.social_number_mother }}">&nbsp;
                <input class="button" type="submit" value="Valider">

                <br></br>

            </form>

            <form class = "form" method='POST' action=''> {% csrf_token %}
                <br></br>
                {{ form.as_p}} <!-- Display child part formulary -->
                {{ value|date:"%d/%m/%Y" }}
                <br></br>

                <input class="button" type ="submit" value="Valider l'acte de naissance" /> 
            </form>


{% endblock content %}

EDIT 2 : 编辑2:

I take a picture from POST data resume and it's maybe an explanation to my error expected string or buffer ! 我从POST数据恢复中拍照,这可能是对我的错误expected string or buffer的解释! I have int and I don't know why 我有int ,不知道为什么

在此处输入图片说明

You calling a POST method, retrieving parameters as if they are in GET method. 您调用POST方法,检索参数就好像它们在GET方法中一样。

But even after you calling POST method your request.POST is empty. 但是即使调用POST方法后,您的request.POST也为空。

Your form.is_valid() is throwing the error you getting, that means you calling a POST method. 您的form.is_valid()抛出您得到的错误,这意味着您调用POST方法。 You need to debug why your POST is empty. 您需要调试POST为什么为空。

Show us your code where you forming a request. 向我们显示您形成请求的代码。

UPDATE : 更新

Yes you are not forming a POST method correctly. 是的,您没有正确形成POST方法。

Request URL: http://localhost:8000/BirthCertificate/formulaire2?social_number=1+87+10+STRASBOURG+-+583403&social_number_father=1+99+12+BREST+-+765533&social_number_mother=1+87+10+STRASBOURG+-+583403
this tells that you are passing parameters in querystring which is GET way whereas in POST you pass parameters in body. 这表明您以GET方式在querystring中传递参数,而在POST您在body中传递参数。

UPDATE 2 : 更新2

You need to specify action=/formulaire2/ or action=/BirthCertificate/formulaire2/ in your html form 您需要在HTML表单中指定action=/formulaire2/action=/BirthCertificate/formulaire2/

I found the answer : the problem was located in my forms.py file. 我找到了答案:问题位于我的forms.py文件中。 In my models, I have birthday which is a DateField and in my form it's a Person ForeignKey .. 在我的模型中,我的birthday是DateField,在我的形式中是Person ForeignKey ..

So I have to write : 所以我要写:

My forms/py file : 我的表格/ py文件:

class BirthCertificateForm2(forms.ModelForm):
    fk_parent1 = CustomLabelModelChoiceField(Person.objects.filter(), required=False, label = "Père", label_func=lambda obj: '%s %s %s' % (obj.lastname, obj.firstname, obj.social_number), empty_label=None)
    fk_parent2 = CustomLabelModelChoiceField(Person.objects.filter(), required=False, label = "Mère", label_func=lambda obj: '%s %s %s' % (obj.lastname, obj.firstname, obj.social_number), empty_label=None)
    sex = forms.CharField(required=False, label = "Sexe")
    birthcountry = forms.CharField(required=False, label = "Pays de Naissance")
    mairie = forms.CharField(widget=forms.HiddenInput(), initial=Mairie.objects.get(id=1).city.encode('utf-8')) 


    class Meta :
        model = BirthCertificate
        fields = ['lastname', 'firstname', 'sex', 'birthday', 'birthhour', 'birthcity', 'birthcountry','fk_parent1', 'fk_parent2', 'mairie', 'social_number']
        widgets = {'country': CountrySelectWidget()}

        def __init__(self, *args, **kwargs):    
            super(BirthCertificateForm2, self).__init__(*args, **kwargs)
            for key, value in self.fields.iteritems() :
                self.fields[key].widget.attrs.update({'class':'form-fields'})

My views function : 我的意见功能:

@login_required
def BirthCertificate_Form_unique_number(request) :

    #User fill some fields
    query_social_number = request.GET.get('social_number')
    query_social_number_father = request.GET.get('social_number_father')
    query_social_number_mother = request.GET.get('social_number_mother')

    if request.method == 'POST':

        form = BirthCertificateForm2(request.POST or None)

        if form.is_valid() :   # Vérification sur la validité des données
            post = form.save()
            return HttpResponseRedirect(reverse('BC_treated2', kwargs={'id': post.id}))

    else:

        form = BirthCertificateForm2()

        parent1 = Person.objects.filter(social_number=query_social_number_father)
        parent2 = Person.objects.filter(social_number=query_social_number_mother)
        individu = get_object_or_404(Person, social_number = query_social_number)

        form.fields['fk_parent1'].queryset = parent1
        form.fields['fk_parent2'].queryset = parent2
        form.fields['lastname'].initial = individu.lastname
        form.fields['firstname'].initial = individu.firstname
        form.fields['birthday'].initial = individu.birthday
        form.fields['birthcity'].initial = individu.birthcity
        form.fields['birthcountry'].initial = individu.birthcountry
        form.fields['sex'].initial = individu.sex
        form.fields['social_number'].initial = individu.social_number


    context = {
        "form" : form,

    }
    print request.POST

    return render(request, 'BC_form2.html', context)

And now it works :) 现在它可以工作了:)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM