Django CreateView 不保存对象
Django CreateView does not save object
我正在尝试在 Django 应用程序中使用创建视图 class,但无法保存对象。我尝试了相关问题 here and here 中发布的一些建议,但没有结果。
错误是
NoReverseMatch at /metas/add-meta
Reverse for 'metas_detalle' with arguments '()' and keyword arguments '{'pk': None}' not found. 1 pattern(s) tried: ['metas/(?P\d+)/control$']
表单有效且有效,class 调用 save()
方法但对象未保存,因此 id
为 None
。
这是我的 models.py
:
class MetasSPE(models.Model):
puesto = models.CharField("Cargo", max_length=6, choices=PUESTOS)
clave = models.CharField("Clave de la Meta", max_length=2)
nom_corto = models.CharField('Identificación', max_length=25)
year = models.PositiveIntegerField("Año")
evaluacion = models.BooleanField('Evaluación', default=True)
ciclos = models.PositiveSmallIntegerField('Repeticiones')
descripcion = models.TextField('Descripción de la Meta')
descripcion_html = models.TextField(
'Descripción de la Meta', editable=False)
soporte = models.FileField(
'Soporte', upload_to=archivo_soporte, blank=True, null=True)
usuario = models.ForeignKey(User, related_name='meta_user', editable=False)
creacion = models.DateTimeField(auto_now_add=True)
actualiza = models.DateTimeField(auto_now=True)
def get_absolute_url(self):
from django.core.urlresolvers import reverse
return reverse('metas_detalle', kwargs={'pk': self.id})
get_absolute_url()
正在运行,已在 python manage.py shell
中测试:
In [1]: from django.core.urlresolvers import reverse
In [2]: reverse('metas_detalle', kwargs={'pk': 1})
Out[2]: '/metas/1/control'
这是forms.py
:
class MetasSPEForm(forms.ModelForm):
class Meta:
model = MetasSPE
fields = ("puesto", "clave", "nom_corto", "evaluacion", "ciclos", "descripcion", "soporte")
这是我的 views.py
:
class CrearMeta(CreateView):
model = MetasSPE
form_class = MetasSPEForm
template_name = 'metas/form_base.html'
def form_valid(self, form):
form.instance.usuario = self.request.user
form.instance.year = 2015
return super(CrearMeta, self).form_valid(form)
urls.py
看起来像这样:
urlpatterns = patterns(
'metas.views',
url(r'^$', 'home', name='metas_index'),
url(r'^(?P<pk>\d+)/control$', MetaDetalle.as_view(), name='metas_detalle'),
url(r'^add-meta$', 'agregar_meta', name='metas_add'),
)
顺便说一句,我试过这个函数,得到了完全相同的错误,但我看不出原因:
# from annoying.decorators import render_to
# from django.contrib.auth.decorators import login_required
@login_required
@render_to('metas/form_base.html')
def agregar_meta(request):
if request.method == 'POST':
form = MetasSPEForm(request.POST, request.FILES)
if form.is_valid():
meta = form.save(commit=False)
meta.usuario = request.user
meta.year = 2015
meta.save()
return redirect('metas_detalle', kwargs={'pk': meta.id})
else:
form = MetasSPEForm()
return {'title': 'Agregar nueva meta', 'form': form}
希望你能帮助我。
根据错误,您定义了以下 URL 模式:
metas/(?P\d+)/control$
...应该是metas/(?P<pk>\d+)/control$
请注意,这与上面给定的模式不同:
urlpatterns = patterns(
'metas.views',
url(r'^$', 'home', name='metas_index'),
url(r'^(?P<pk>\d+)/control$', MetaDetalle.as_view(), name='metas_detalle'),
url(r'^add-meta$', 'agregar_meta', name='metas_add'),
)
如果我不得不猜测,你正在根目录中做类似下面的事情 urls.py:
urlpatterns = patterns(
'',
url(r'^metas/', include('metas.urls')),
# Bad line with bad regex below!
url(r'metas/(?P\d+)/control$', MetaDetalle.as_view(), name='metas_detalle'),
)
其实我发现了问题:
class MetasSPE(models.Model):
...
def save(self, **kwargs):
"""
Se sobre-escribe el método `save()` para guardar la descripción con html.
:param kwargs: Parámetros en clave
:return: nada
"""
from markdown import markdown
self.descripcion_html = markdown(
self.descripcion, outpu_format='html5', lazy_ol=True
)
def __str__(self):
...
您忘记在覆盖的 save() 方法上调用 super(),这意味着您的模型将永远不会保存:
class MetasSPE(models.Model):
...
def save(self, **kwargs):
"""
Se sobre-escribe el método `save()` para guardar la descripción con html.
:param kwargs: Parámetros en clave
:return: nada
"""
from markdown import markdown
self.descripcion_html = markdown(
self.descripcion, outpu_format='html5', lazy_ol=True
)
super(MetasSPE, self).save(**kwargs)
我正在尝试在 Django 应用程序中使用创建视图 class,但无法保存对象。我尝试了相关问题 here and here 中发布的一些建议,但没有结果。
错误是
NoReverseMatch at /metas/add-meta Reverse for 'metas_detalle' with arguments '()' and keyword arguments '{'pk': None}' not found. 1 pattern(s) tried: ['metas/(?P\d+)/control$']
表单有效且有效,class 调用 save()
方法但对象未保存,因此 id
为 None
。
这是我的 models.py
:
class MetasSPE(models.Model):
puesto = models.CharField("Cargo", max_length=6, choices=PUESTOS)
clave = models.CharField("Clave de la Meta", max_length=2)
nom_corto = models.CharField('Identificación', max_length=25)
year = models.PositiveIntegerField("Año")
evaluacion = models.BooleanField('Evaluación', default=True)
ciclos = models.PositiveSmallIntegerField('Repeticiones')
descripcion = models.TextField('Descripción de la Meta')
descripcion_html = models.TextField(
'Descripción de la Meta', editable=False)
soporte = models.FileField(
'Soporte', upload_to=archivo_soporte, blank=True, null=True)
usuario = models.ForeignKey(User, related_name='meta_user', editable=False)
creacion = models.DateTimeField(auto_now_add=True)
actualiza = models.DateTimeField(auto_now=True)
def get_absolute_url(self):
from django.core.urlresolvers import reverse
return reverse('metas_detalle', kwargs={'pk': self.id})
get_absolute_url()
正在运行,已在 python manage.py shell
中测试:
In [1]: from django.core.urlresolvers import reverse
In [2]: reverse('metas_detalle', kwargs={'pk': 1})
Out[2]: '/metas/1/control'
这是forms.py
:
class MetasSPEForm(forms.ModelForm):
class Meta:
model = MetasSPE
fields = ("puesto", "clave", "nom_corto", "evaluacion", "ciclos", "descripcion", "soporte")
这是我的 views.py
:
class CrearMeta(CreateView):
model = MetasSPE
form_class = MetasSPEForm
template_name = 'metas/form_base.html'
def form_valid(self, form):
form.instance.usuario = self.request.user
form.instance.year = 2015
return super(CrearMeta, self).form_valid(form)
urls.py
看起来像这样:
urlpatterns = patterns(
'metas.views',
url(r'^$', 'home', name='metas_index'),
url(r'^(?P<pk>\d+)/control$', MetaDetalle.as_view(), name='metas_detalle'),
url(r'^add-meta$', 'agregar_meta', name='metas_add'),
)
顺便说一句,我试过这个函数,得到了完全相同的错误,但我看不出原因:
# from annoying.decorators import render_to
# from django.contrib.auth.decorators import login_required
@login_required
@render_to('metas/form_base.html')
def agregar_meta(request):
if request.method == 'POST':
form = MetasSPEForm(request.POST, request.FILES)
if form.is_valid():
meta = form.save(commit=False)
meta.usuario = request.user
meta.year = 2015
meta.save()
return redirect('metas_detalle', kwargs={'pk': meta.id})
else:
form = MetasSPEForm()
return {'title': 'Agregar nueva meta', 'form': form}
希望你能帮助我。
根据错误,您定义了以下 URL 模式:
metas/(?P\d+)/control$
...应该是metas/(?P<pk>\d+)/control$
请注意,这与上面给定的模式不同:
urlpatterns = patterns(
'metas.views',
url(r'^$', 'home', name='metas_index'),
url(r'^(?P<pk>\d+)/control$', MetaDetalle.as_view(), name='metas_detalle'),
url(r'^add-meta$', 'agregar_meta', name='metas_add'),
)
如果我不得不猜测,你正在根目录中做类似下面的事情 urls.py:
urlpatterns = patterns(
'',
url(r'^metas/', include('metas.urls')),
# Bad line with bad regex below!
url(r'metas/(?P\d+)/control$', MetaDetalle.as_view(), name='metas_detalle'),
)
其实我发现了问题:
class MetasSPE(models.Model):
...
def save(self, **kwargs):
"""
Se sobre-escribe el método `save()` para guardar la descripción con html.
:param kwargs: Parámetros en clave
:return: nada
"""
from markdown import markdown
self.descripcion_html = markdown(
self.descripcion, outpu_format='html5', lazy_ol=True
)
def __str__(self):
...
您忘记在覆盖的 save() 方法上调用 super(),这意味着您的模型将永远不会保存:
class MetasSPE(models.Model):
...
def save(self, **kwargs):
"""
Se sobre-escribe el método `save()` para guardar la descripción con html.
:param kwargs: Parámetros en clave
:return: nada
"""
from markdown import markdown
self.descripcion_html = markdown(
self.descripcion, outpu_format='html5', lazy_ol=True
)
super(MetasSPE, self).save(**kwargs)