我是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
视图。最初我的意图是在表单中输入不在数据库中的内容时显示错误。
答案 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'属性