我已经在网上搜了几天而找不到任何东西,所以我希望你们能指出我正确的方向。我正在尝试自定义django管理员,以便在URL字段后显示内联按钮。该按钮出现,并且javascript正常工作,除非标记为null=True
和blank=True
,否则管理员验证会继续说明该字段是必需的;我希望url字段是可选的。
有没有办法让这个字段可选?我假设它是blank=True
和null=True
的某种组合,但我已经在少数几个没有运气的地方尝试过它。
以下是我认为相关的代码位(同样,我知道来自小部件的内联CSS是一个坏主意。只有在我完成所有工作之后!)。如果您还需要查看其他内容,请告知我们。
models.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)
admin.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))
提前致谢。
答案 0 :(得分:1)
您需要创建自定义窗口小部件并将其与内置URL字段一起使用。你正在处理一个formfield而不是一个modelfield。所以使用'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