2017-01-04 4 views
0

Я новичок с Джанго, поэтому я прошу прощения за это (возможно) немой вопрос:AttributeError «юникода» объект не имеет атрибута «Numero»

Я пытаюсь сделать форму на основе содержания модель с именем Linea, которая, в зависимости от ввода, перенаправляет пользователя на вид с именем lineas_detalles. Если вход не является частью модели Linea, форма не должна ничего делать.

я могу отлично загрузить страницу, где форма, но когда я ввожу что-то и я представляю, я получаю ошибку:

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

Содержание, которое предназначено для перехода в форму является числом.

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', {}) 


[...] 

отслеживающий Marcks происхождение проблемы в этой строке файла views.py: linea_numero = str(linea.numero)


Update 1

После коррекции Jaime Sanz Исправлена ​​ошибка AttributeError. Теперь код выглядеть следующим образом:

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) 
[...] 

Остальное такое же, как и раньше. Во всяком случае, теперь я получаю эту другую ошибку:

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>)/$'] 

с отслеживающими маркировками на ТИС линии в views.py:

return redirect('lineas_detalles', linea_numero=linea_numero) 

Я учусь программировать сам, извините, если эти вопросы слишком основные ,


Update 2

Я сделал некоторые изменения, так что теперь у меня нет каких-либо ошибок:

urls.py

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

просмотров .py

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

Но теперь я понимаю, что независимо от того, какое число я набираю в форме, вид Lineas отправляет мне сообщение Lineas_detalles. Первоначально мое намерение состояло в том, чтобы показать ошибку, когда что-то, чего нет в базе данных, вводится в форму.

+4

ошибка уже говорит для себя, 'linea' является объектом unicode (просто рассматривайте его как строку), unicode-объект не имеет атрибута' numero', о чем еще вам не ясно? –

ответ

0

Проблема, действительно, в ваших views.py. Эта линия:

linea = form.cleaned_data['linea'] 

не возвращает экземпляр модели Linea, она возвращает значение, что «Linea» поле имеет в своей форме. Чтобы получить экземпляр Linea вы должны сохранить форму:

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

Это, однако, сохранить изменения в базу данных. Если вы не хотите, что вы можете сделать то же самое, но с:

linea = form.save(commit=False) 

редактировать также, ваша модель Linea, кажется, не имеют «Numero» атрибут

+0

Gracias Jaime :) Во всяком случае, если бы вы могли прочитать обновление, я был бы благодарен. – Pepv

Смежные вопросы