1

我已经在互联网上搜索了几天,找不到任何东西,所以我希望你们能指出我正确的方向。我正在尝试自定义 django 管理员,以便在 URL 字段之后内联显示一个按钮。该按钮出现,并且 javascript 工作,除了标记它null=True并且blank=True管理员验证一直说该字段是必需的;我希望 url 字段是可选的。

有没有办法让这个字段成为可选的?我假设它是 and 的某种组合blank=Truenull=True但我已经在少数几个地方尝试过,但没有运气。

以下是我认为相关的代码位(另外,我知道小部件中的内联 CSS 是一个坏主意。只有在我让一切正常之前!)。如果您需要查看其他内容,请告诉我。

模型.py

class Team(models.Model):
    name = models.CharField(max_length=64)
    name_color = models.CharField(max_length=7, default='#000000')
    name_shadow_color = models.CharField(max_length=7, default='#ffffff')
    created = models.DateField(editable=True, default=datetime.now)
    retired = models.DateField(null=True, blank=True)
    url = models.URLField(null=True, blank=True, default=None)

管理员.py

class TeamAdmin(admin.ModelAdmin):
    list_filter = ('created', 'retired',)
    list_select_related = True
    list_display = ('name', 'created',)
    search_fields = ('name', )
    ordering = ('name',)
    form = TeamAdminForm

admin_forms.py

class TeamAdminForm(forms.ModelForm):
    url = URLActionField()

    class Media:
        js = ('js/jquery-1.8.0.min.js', 'js/admin/teamform.js', )

    class Meta:
        model = Team

admin_widgets.py

class URLActionField(forms.TextInput):
    def render(self, name, value, attrs=None):
        if attrs is None:
            attrs = {}

        # TODO: not responsive!!
        if 'style' not in attrs.keys():
            attrs['style'] = 'width: 275px;'
        else:
            attrs['style'] = '%s width: 275px;' % attrs['style']

        attrs['required'] = False
        attrs['blank'] = True
        attrs['null'] = True

        output = []
        output.append(super(URLActionField, self).render(name, value, attrs))
        output.append(' <input type="button" value="%s" style="width: 200px; margin-left: 20px; height: 24px; line-height: 15px;" class="grp-button" id="url-scraper">' % unicode(_(u'Scrape URL for data')))
        return mark_safe(u''.join(output))

提前致谢。

4

1 回答 1

1

您需要制作一个自定义小部件并将其与内置 URL 字段一起使用。您正在处理表单域而不是模型域。所以使用'required = False'。除非您有充分的理由,否则请避免在基于字符串的字段上使用 null。如果基于字符串的字段具有 null=True,这意味着它有两个可能的“无数据”值:NULL 和空字符串。

在 Model.py 中:

class Team(models.Model):
    ...
    url = models.URLField(blank=True)

在 Admin.py 中附加到内置 AdminURLFieldWidget 输出(不需要 js):

from django.contrib.admin.widgets import AdminURLFieldWidget

class CustomAdminURLFieldWidget(AdminURLFieldWidget):
    def render(self, name, value, attrs=None):
        output = []
        output.append(super(CustomAdminURLFieldWidget, 
            self).render(name, value, attrs))
        if value:
            output.append('<p><a href="%s">%s</a></p>' %(value, value))
        return mark_safe(u''.join(output))

在 Admin.py 创建一个表单:

from models import Team

class TeamAdminForm(forms.ModelForm):
        url = forms.URLField(required=False, widget=CustomAdminURLFieldWidget)
        class Meta:
            model = Team

在 Admin.py 中创建一个 ModelAdmin:

class TeamAdmin(admin.ModelAdmin):
    form = TeamAdminForm
于 2013-04-25T01:53:44.460 回答