ValueError - 无法指定“u”'“

时间:2013-02-28 22:32:28

标签: python django

我正在尝试编辑其他开发人员的一些代码。一切顺利,直到我收到这个错误:

  

/ berichten / registreren /的ValueError /   不能指定“你”“:”Bericht.beller“必须是”贝勒“实例。

我将从追溯开始:

Environment:
Request Method: POST
Request URL: http://127.0.0.1:8000/berichten/registreren/

Django Version: 1.4.3
Python Version: 2.7.2
Installed Applications:
('django.contrib.auth',
'django.contrib.contenttypes',


'django.contrib.sessions',
 'django.contrib.sites',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'south',
 'mm')
Installed Middleware:
('django.middleware.common.CommonMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'mm.middleware.LoginRequiredMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware')


Traceback:
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  111.                         response = callback(request, *callback_args, **callback_kwargs)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/views/generic/base.py" in view
  48.             return self.dispatch(request, *args, **kwargs)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/views/generic/base.py" in dispatch
  69.         return handler(request, *args, **kwargs)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/views/generic/edit.py" in post
  172.         return super(BaseCreateView, self).post(request, *args, **kwargs)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/views/generic/edit.py" in post
  137.         if form.is_valid():
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/forms/forms.py" in is_valid
  124.         return self.is_bound and not bool(self.errors)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/forms/forms.py" in _get_errors
  115.             self.full_clean()
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/forms/forms.py" in full_clean
  272.         self._post_clean()
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/forms/models.py" in _post_clean
  309.         self.instance = construct_instance(self, self.instance, opts.fields, opts.exclude)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/forms/models.py" in construct_instance
  51.             f.save_form_data(instance, cleaned_data[f.name])
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/fields/__init__.py" in save_form_data
  454.         setattr(instance, self.name, data)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/fields/related.py" in __set__
  366.                                  self.field.name, self.field.rel.to._meta.object_name))

Exception Type: ValueError at /berichten/registreren/
Exception Value: Cannot assign "u''": "Bericht.beller" must be a "Beller" instance.

Models.py

class Beller(models.Model):
    titel = models.CharField(max_length=10, blank=True)
    naam = models.CharField(max_length=30)
    voornaam = models.CharField(max_length=30)
    bedrijf = models.CharField(max_length=50, blank=True, null=True)
    adres = models.CharField(max_length=50)
    plaats = models.ForeignKey(Plaats, blank=True, null=True)
    telefoon = models.CharField(max_length=20, blank=True)
    email = models.EmailField(blank=True)
    taal = models.CharField(max_length=1, choices=TAAL)

    class Meta:
        ordering = ['naam', 'voornaam']

    def __unicode__(self):
        return u"{0} {1}".format(self.naam, self.voornaam)

class Bericht(models.Model):
    klant = models.ForeignKey(Klant)
    lijn = models.ForeignKey(Lijn)
    contact = models.ForeignKey(Contact)
    beller = models.ForeignKey(Beller)

    tijdstip = models.DateTimeField(auto_now_add=True)
    bericht = models.TextField(blank=True)
    status = models.CharField(max_length=1, choices=BERICHT_STATUS)
    gebruiker = models.ForeignKey(User)

forms.py

class BerichtForm(forms.ModelForm):
    lijn = forms.ModelChoiceField(queryset=Lijn.objects.filter(datum_tot__exact=None))
    contact_naam = forms.CharField(required=True, max_length=50)
    contact_pk = forms.CharField(required=True, widget=forms.HiddenInput())
    beller = forms.CharField(required=False, max_length=50, widget=forms.HiddenInput())
    titel = forms.CharField(required=False, max_length=10)
    naam = forms.CharField(required=True, max_length=50)
    voornaam = forms.CharField(required=False, max_length=50)
    bedrijf = forms.CharField(required=False, max_length=50)
    adres = forms.CharField(required=False)
    plaats_pk = forms.CharField(required=False, widget=forms.HiddenInput())
    plaats = forms.CharField(required=False, max_length=50)
    email = forms.EmailField(required=False)
    telefoon = forms.CharField(required=False)
    taal = forms.CharField(widget=forms.Select(choices=TAAL))

    class Meta:
        model = Bericht
        fields = ('lijn', 'contact_naam', 'beller', 'naam', 'titel', 'voornaam', 'bedrijf', 'adres', 'plaats', 'email', 'telefoon', 'taal', 'bericht',)

views.py

class BerichtCreateView(CreateView):
    model = Bericht
    template_name = "mm/bericht/form.html"
    form_class = BerichtForm
    context_object_name = "bericht"
    success_url = reverse_lazy('mm-berichten-registreren')

    def get_context_data(self, **kwargs):
        context = super(BerichtCreateView, self).get_context_data(**kwargs)
        cb = self.request.GET.get('cb', None)
        if cb:
            context['cb'] = cb
        return context

    def get_success_url(self):
        if self.cb:
            return self.success_url + "?cb=" + self.cb
        else:
            return self.success_url

    def form_valid(self, form):
        """Valideer het formulier, maar voeg eerst de klant toe aan de instance """
        self.cb = None
        self.object = form.save(commit=False)
        self.object.klant = self.object.lijn.klant

        # Verwerk contact info
        contact_pk = form.cleaned_data['contact_pk']
        try:
            contact = int(contact_pk)
        except:
            contact = None
        if contact:
            self.object.contact = Contact.objects.get(pk=contact)
        else:
            self.object.contact = Contact()

        # Verwerk beller info
        beller = form.cleaned_data['beller']
        if beller:
            try:
                beller = Beller.objects.get(pk=beller)
            except Beller.DoesNotExist:
                beller = Beller()
        else:
            beller = Beller()

        beller.titel = form.cleaned_data['titel']
        beller.naam = form.cleaned_data['naam']
        beller.voornaam = form.cleaned_data['voornaam']
        beller.bedrijf = form.cleaned_data['bedrijf']
        beller.adres = form.cleaned_data['adres']
        if form.cleaned_data['plaats_pk']:
            beller.plaats = Plaats.objects.get(pk=form.cleaned_data['plaats_pk'])
        else:
            beller.plaats = None
        beller.email = form.cleaned_data['email']
        beller.telefoon = form.cleaned_data['telefoon']
        beller.taal = form.cleaned_data['taal']
        beller.save()
        #self.object.beller = beller
        self.object.gebruiker = self.request.user
        self.object.save()

        if self.request.POST.get('versturen', None):
            self.cb = None

            # Verwerk e-mail communicatie
            if self.object.contact.contact_medium == 'E':
                self.object.send_email()

                if self.object.status == "N":
                    messages.add_message(self.request, messages.WARNING, 'Het bericht kon niet via e-mail worden verstuurd.')
                else:
                    messages.add_message(self.request, messages.SUCCESS, 'Het bericht is verstuurd naar de contactpersoon.')

            else:
                # Add a callback for print to success url
                self.cb = reverse('mm-bericht-afdrukken', args=[self.object.id])
                self.object.status = 'P'

        else:
            self.object.status = 'D'
            messages.add_message(self.request, messages.INFO, 'Het bericht is opgeslagen maar is nog niet verstuurd.')

        self.object.save()

        return super(BerichtCreateView, self).form_valid(form)

如你所见,我正在尝试发送一个Beller()实例,但事实并非如此。

已经感谢你试图帮助我。

1 个答案:

答案 0 :(得分:0)

错误发生在验证期间,而不是form_valid()方法。它正在尝试将字符串验证到beller对象上的“Bericht”字段。 Django这样做是因为它被告知是应该随模型自动保存的字段之一。

BerichtForm元数据的字段中,只包含您希望使用直接从HTML获取的数据填充的Bericht上存在的字段。类似的东西:

class Meta:
    model = Bericht
    fields = ('lijn', 'tijdstip', 'bericht')

PS:可能有帮助的另一条信息是请求的POST正文的内容。