我想检查数据库中是否存在添加的用户输入。如果确实如此,则将用户重定向到现有对象绝对 URL,否则传递并继续保存输入。到目前为止,我设法检查是否存在并获取对象,但返回 HttpResponseRedirect(input_get.get_absolute_url())
没有重定向,尽管我可以在终端中正确打印 url (/tags/215/棒球/
)。
相反,我得到:
"Ensure this value has at most 50 characters (it has 65)."
有什么建议吗?谢谢
forms.py
class TagsForm(forms.ModelForm):
def clean_tag_word(self):
tag_word = self.cleaned_data['tag_word']
tag_filter = TagsNew.objects.filter(tag_word=tag_word)
if tag_filter.exists():
tag_get = TagsNew.objects.get(tag_word=tag_word)
tag_redirect=tag_get.get_absolute_url()
print (tag_redirect)
return HttpResponseRedirect(tag_redirect)
else:
pass
return tag_word
models.py
(get_absolute_url):
def get_absolute_url(self):
return reverse('tags:tagsnew_detail', kwargs={'pk':self.pk, 'slug':self.slug})
模型.py:
class TagsNew(models.Model):
id = models.AutoField (primary_key=True)
tag_word = models.CharField(max_length=50, blank=True)
slug = models.CharField(max_length=50, blank=True)
timestamp=models.DateTimeField(auto_now_add=True, auto_now= False)
updated=models.DateTimeField(auto_now_add=False, auto_now= True)
class Meta:
managed = True
db_table = 'tags_new'
def save(self, *args, **kwargs):
self.slug = slugify(self.tag_word)
super(TagsNew, self).save(*args, **kwargs)
def get_absolute_url(self):
return reverse('tags:tagsnew_detail', kwargs={'pk':self.pk, 'slug':self.slug})
def __str__(self):
return self.tag_word
跟踪:
/tags/221/corrections/
<ul class="errorlist"><li>tag_word<ul class="errorlist"><li>Ensure this value has at most 50 characters (it has 65).</li></ul></li></ul>
[08/Apr/2015 04:47:52] "POST /tags/add/ HTTP/1.1" 200 16662
[08/Apr/2015 04:47:52] "GET /static/js/ajax.js HTTP/1.1" 404 1634
[08/Apr/2015 04:47:52] "GET /static/tags/css/style.css HTTP/1.1" 304 0
最佳答案
问题是您在 clean_tag_word()
中返回一个 HttpResponseRedirect
对象。该函数期望返回一个 <=50 个字符串进入 tag_word
属性,但您却得到了一些大的重定向对象(return HttpResponseRedirect(tag_redirect)
线)。然后,当 Django 尝试将其保存到数据库时,该对象将被调用 __str__
,数据库必须具有某种 65 个字符长的字符串表示形式。
解决方案是将重定向逻辑从表单移动到它所属的 Controller 。如果您使用通用 django View 的子类,则可能在 render_to_response()
或 form_valid()
中。
此外,切勿使用else: pass
。这是毫无意义的。
关于python - django如果对象存在重定向到绝对url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29498644/