【问题标题】:Django Admin escaping textDjango Admin 转义文本
【发布时间】:2017-09-18 02:30:53
【问题描述】:

我最近将 Django 从 1.3 升级到 1.8.18,并且在 Django 管理中为预填写表单而定制的链接存在问题。例如,我有以下链接:

/admin/miscellaneous/whatsnew/add/?title=...%20competition%20results%20uploaded&pub_date=21-04-2017&body=&link=

执行时,表单中的预填充数据如下所示:

它应该是这样的:

在 Safari 中直接从 URL 栏测试时,按 Enter 后会更改为:

https://flyball.org.au/admin/miscellaneous/whatsnew/add/?title=...%2520competition%2520results%2520uploaded&pub_date=21-04-2017&body=&link=

models.py

class WhatsNew(models.Model):
    title = models.CharField(max_length=100,help_text='Title, MAX 100 characters.')
    body = models.TextField()
    pub_date = models.DateField()
    message_expiry = models.DateField(default=datetime.date.today() + relativedelta(years=1))
    link = models.URLField(blank=True, null=True)

    class Meta:
        ordering = ['-pub_date']
        verbose_name_plural = "Whats New?"

    def __unicode__(self):
        return self.title

admin.py

import models
from django.contrib import admin

class WhatsNewAdmin(admin.ModelAdmin):
    list_display = ('title','pub_date','message_expiry','link','body')

admin.site.register(models.WhatsNew, WhatsNewAdmin)

我能做些什么来解决这个问题?

【问题讨论】:

  • 您能否显示负责填写此表单的代码,即从查询参数中读取title 并将其提供给表单?
  • @AKS 我在这里没有做任何特殊代码,它是 Django 的一部分,不知道在哪里可以找到它
  • 它确实对我有用。我尝试使用%20,结果在管理表单中出现空格。
  • @AKS 在升级到 Django 1.8 之前它也曾为我工作
  • 这在 Django 1.10 中为我工作。只是为了好玩,尝试使用+ 而不是%20,因为这是管理员默认的操作。

标签: django python-2.7 django-admin


【解决方案1】:

所以,我不确定如何在 ModelAdmin 上执行此操作,但您可以在模型上创建自定义设置器来处理这种情况。以下是我将如何转义 URL 编码的字符串:

import urllib


class WhatsNew(models.Model):
    # Field with custom setter
    _title = models.CharField(max_length=100,
                             help_text='Title, MAX 100 characters.',
                             db_column='title')

    body = models.TextField()
    pub_date = models.DateField()
    message_expiry = models.DateField(default=datetime.date.today() + relativedelta(years=1))
    link = models.URLField(blank=True, null=True)

    # Custom getter and setter
    @property
    def title(self):
        return self._title

    @title.setter
    def title(self, value):
        self._title = urllib.unquote(value)

    class Meta:
        ordering = ['-pub_date']
        verbose_name_plural = "Whats New?"

    def __unicode__(self):
        return self._title

【讨论】:

  • 这很有趣,以前没见过。我刚刚使用了+ 符号,它似乎已经解决了。谢谢
  • 我刚刚看到了一些问题,特别是在 chrome 中,它会阻止您在 URL 中放置符号并自动为您编码。我认为这可能是正在发生的事情,但我想不是!很高兴一切顺利!
【解决方案2】:

使用+ 而不是%20 来表示空间,它可以工作。

你的链接应该是这样的:

/admin/miscellaneous/whatsnew/add/?title=...+competition+results+uploaded&pub_date=21-04-2017&body=&link=

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 2015-09-17
    • 2011-11-17
    • 1970-01-01
    • 2015-11-08
    • 2012-02-27
    相关资源
    最近更新 更多