AttributeError' unicode'对象没有属性' numero'

时间:2017-01-04 21:01:50

标签: python django forms unicode

我是django的新人,所以我为这个(可能)愚蠢的问题道歉:

我尝试根据名为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', {})


[...]

回溯在views.py文件的这一行中突破了问题的根源:linea_numero = str(linea.numero)

更新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)

我自己学习编程,对不起,如果这些问题太基础了。

更新2

我做了一些更改,所以现在我没有任何错误:

urls.py

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

views.py

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

但现在我意识到无论我在表单中输入什么号码,Lineas视图都会将我发送到Lineas_detalles视图。最初我的意图是在表单中输入不在数据库中的内容时显示错误。

1 个答案:

答案 0 :(得分:0)

问题确实存在于你的views.py中。这一行:

linea = form.cleaned_data['linea']

不返回模型Linea的实例,它返回“linea” field 在表单中的值。要获取Linea实例,您必须保存表单:

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

但是,这会将更改保存到数据库中。如果您不想这样做,您可以这样做,但是:

linea = form.save(commit=False)

编辑,您的Linea模型似乎没有'numero'属性