python - django如果对象存在重定向到绝对url

标签 python django forms redirect exists

我想检查数据库中是否存在添加的用户输入。如果确实如此,则将用户重定向到现有对象绝对 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/

相关文章:

python - 当我尝试运行 container.inside() 方法时,Jenkins 挂起

python - 属性错误 : module 'PIL.Image' has no attribute 'register_extensions'

Python-二维字符串中字母的位置

django - 如何仅为 django 管理门户设置默认 TZ?

python - Django 尝试在另一个模型中保存数据后将数据保存到新模型中

python - celery (4.2): how to get task id for current task

javascript - HTML 表单的日期/时间输入

javascript - 表单操作不起作用

python - 使用allowDiskUse时语法无效:True through PyMongo

php - 发送邮件到数据库