2017-01-04 4 views
0

ich mit django neu bin, so dass ich entschuldige mich für diese (wahrscheinlich) dumme Frage:Attribute ‚Unicode‘ Objekt hat kein Attribut ‚numero‘

I basierend auf dem Inhalt eines ein Formular machen bin versucht, Modell mit dem Namen Linea, das den Benutzer abhängig von der Eingabe in eine Ansicht mit dem Namen lineas_detalles umleitet. Wenn die Eingabe kein Teil des Modells Linea ist, soll das Formular nichts tun.

ich die Seite perfekt laden kann, wo die Form ist, aber wenn ich etwas eingeben und Ich lege ich den Fehler:

AttributeError at /lineas/ 
'unicode' object has no attribute 'numero' 

Der Inhalt, der in der Form gehen soll, ist eine Zahl.

lineas.html

{% load staticfiles %} 
[...] 
{% block content %} 
    <h1>Escoja una línea</h1> 
    <form method="POST" class="post-form">{% csrf_token %} 
     {{ form.as_p }} 
     <button type="submit">Actualizar</button> 
    </form> 
{% endblock %} 

forms.py

from django import forms 
from .models import Linea 


class LineaForm(forms.ModelForm): 


    class Meta: 
     model = Linea 
     fields = ('linea',) 

models.py

from __future__ import unicode_literals 
from django.db import models 


class Linea(models.Model): 
    linea = models.CharField(max_length=2) 


    def __str__(self): 
     return self.linea 

[...] 

urls.py

from django.conf.urls import url 
from . import views 


urlpatterns = [ 
    [...] 
    url(r'^lineas/$', views.lineas, name='lineas'), 
    url(r'^lineas/(?P<linea_numero>)/$', views.lineas_detalles, name='lineas_detalles'), 
] 

views.py

from django.shortcuts import render, redirect 
from .forms import LineaForm 


def lineas(request): 
    if request.method == "POST": 
     form = LineaForm(request.POST) 
     if form.is_valid(): 
      linea = form.cleaned_data['linea'] 
      linea_numero = str(linea.numero) 
      return redirect('lineas_detalles', linea_numero=linea_numero) 
    else: 
     form = LineaForm() 
    return render(request, 'bustopapp/lineas.html', {'form': form}) 


def lineas_detalles(request): 
    return render(request, 'bustopapp/lineas_detalles.html', {}) 


[...] 

Die Zurückverfolgungs Marcks den Ursprung des Problems in dieser Zeile der Datei views.py: linea_numero = str(linea.numero)


-Update 1

Nach der Korrektur von Jaime Sanz ist der AttributeError korrigiert. Jetzt ist der Code sieht wie folgt aus:

forms.py

[...] 
class LineaForm(forms.ModelForm): 


    class Meta: 
     model = Linea 
     fields = ('numero',) 

models.py

[...] 
class Linea(models.Model): 
    numero = models.CharField(max_length=2) 


    def __str__(self): 
     return self.numero 

views.py

[...] 
form = LineaForm(request.POST) 
     if form.is_valid(): 
      linea = form.save(commit=False) 
      linea_numero = str(linea.numero) 
      return redirect('lineas_detalles', linea_numero=linea_numero) 
[...] 

Der Rest ist der gleiche wie zuvor. Wie auch immer, jetzt bekomme ich diese anderen Fehler:

NoReverseMatch at /lineas/ 
Reverse for 'lineas_detalles' with arguments '()' and keyword arguments '{'linea_numero': '3'}' not found. 1 pattern(s) tried: ['lineas/(?P<linea_numero>)/$'] 

Mit den Zurückverfolgungs bei tis Linie in views.py Kennzeichnung:

return redirect('lineas_detalles', linea_numero=linea_numero) 

I Programmierung von mir lernen bin, tut mir leid, wenn diese Fragen sind zu einfach .


Update 2

ich einige Änderungen vorgenommen haben, ich so jetzt keine Fehler haben:

urls.py

url(r'^lineas/(?P<linea_numero>\d+)/$', views.lineas_detalles, name='lineas_detalles'), 

Ansichten .py

Aber jetzt merke ich, dass unabhängig davon, welche Nummer ich in das Formular eintippe, die Lineas Ansicht mich an die Lineas_detalles Ansicht sendet. Ursprünglich wollte ich einen Fehler anzeigen, wenn etwas, das nicht in der Datenbank ist, in das Formular eingegeben wird.

+4

Der Fehler bereits spricht für sich selbst ist 'linea' ein Unicode-Objekt (man bedenke es einfach als String), Unicode-Objekt hat kein Attribut' numero', worüber man sich sonst nicht im Klaren ist? –

Antwort

0

Das Problem ist in der Tat in Ihrer views.py. Diese Zeile:

linea = form.cleaned_data['linea'] 

nicht eine Instanz des Modells zurückzukehren Linea, gibt sie den Wert, dass das ‚linea‘ Feld in Ihrer Form. Um die Linea Instanz zu erhalten, müssen Sie das Formular speichern:

form = LineaForm(request.POST) 
if form.is_valid(): 
    linea = form.save() 
    linea_numero = str(linea.numero) 

Dies wird, speichern jedoch die Änderungen in der Datenbank. Wenn Sie nicht, dass wollen, können Sie das gleiche tun, aber mit:

linea = form.save(commit=False) 

bearbeiten auch, Ihre Linea-Modell scheint nicht zu einem ‚numero‘ haben Attribut

+0

Gracias Jaime :) Wie auch immer, wenn Sie das Update lesen könnten, wäre ich dankbar. – Pepv

Verwandte Themen