Resize fields in Django Admin

后端 未结 14 2007
一生所求
一生所求 2020-12-22 15:12

Django tends to fill up horizontal space when adding or editing entries on the admin, but, in some cases, is a real waste of space, when, i.e., editing a date field, 8 chara

相关标签:
14条回答
  • 2020-12-22 15:30

    If you want to change the attributes on a per-field instance, you can add the "attrs" property directly in to your form entries.

    for example:

    class BlogPostForm(forms.ModelForm):
        title = forms.CharField(label='Title:', max_length=128)
        body = forms.CharField(label='Post:', max_length=2000, 
            widget=forms.Textarea(attrs={'rows':'5', 'cols': '5'}))
    
        class Meta:
            model = BlogPost
            fields = ('title', 'body')
    

    The "attrs" property basically passes along the HTML markup that will adjust the form field. Each entry is a tuple of the attribute you would like to override and the value you would like to override it with. You can enter as many attributes as you like as long as you separate each tuple with a comma.

    0 讨论(0)
  • 2020-12-22 15:31

    You should use ModelAdmin.formfield_overrides.

    It is quite easy - in admin.py, define:

    from django.forms import TextInput, Textarea
    from django.db import models
    
    class YourModelAdmin(admin.ModelAdmin):
        formfield_overrides = {
            models.CharField: {'widget': TextInput(attrs={'size':'20'})},
            models.TextField: {'widget': Textarea(attrs={'rows':4, 'cols':40})},
        }
    
    admin.site.register(YourModel, YourModelAdmin)
    
    0 讨论(0)
  • 2020-12-22 15:31

    for 1.6, using forms I had to specify the attributes of the textarea inside the charfield:

    test1 = forms.CharField(max_length=400, widget=forms.Textarea( attrs={'rows':'2', 'cols': '10'}),  initial='', help_text=helptexts.helptxt['test'])
    
    0 讨论(0)
  • 2020-12-22 15:32

    A quick and dirty option is to simply provide a custom template for the model in question.

    If you create a template named admin/<app label>/<class name>/change_form.html then the admin will use that template instead of the default. That is, if you've got a model named Person in an app named people, you'd create a template named admin/people/person/change_form.html.

    All the admin templates have an extrahead block you can override to place stuff in the <head>, and the final piece of the puzzle is the fact that every field has an HTML id of id_<field-name>.

    So, you could put something like the following in your template:

    {% extends "admin/change_form.html" %}
    
    {% block extrahead %}
      {{ block.super }}
      <style type="text/css">
        #id_my_field { width: 100px; }
      </style>
    {% endblock %}
    
    0 讨论(0)
  • 2020-12-22 15:35

    And one more example too :

    class SecenekInline(admin.TabularInline):
       model = Secenek
       # classes = ['collapse']
       def formfield_for_dbfield(self, db_field, **kwargs):
           field = super(SecenekInline, self).formfield_for_dbfield(db_field, **kwargs)
           if db_field.name == 'harf':
               field.widget = TextInput(attrs={'size':2})
           return field
       formfield_overrides = {
           models.TextField: {'widget': Textarea(attrs={'rows':2})},
       }
       extra = 2
    

    If you want to edit only a specific fields size, you can use this.

    0 讨论(0)
  • 2020-12-22 15:42

    You can set arbitrary HTML attributes on a widget using its "attrs" property.

    You can do this in the Django admin using formfield_for_dbfield:

    class MyModelAdmin(admin.ModelAdmin):
      def formfield_for_dbfield(self, db_field, **kwargs):
        field = super(ContentAdmin, self).formfield_for_dbfield(db_field, **kwargs)
        if db_field.name == 'somefield':
          field.widget.attrs['class'] = 'someclass ' + field.widget.attrs.get('class', '')
        return field
    

    or with a custom Widget subclass and the formfield_overrides dictionary:

    class DifferentlySizedTextarea(forms.Textarea):
      def __init__(self, *args, **kwargs):
        attrs = kwargs.setdefault('attrs', {})
        attrs.setdefault('cols', 80)
        attrs.setdefault('rows', 5)
        super(DifferentlySizedTextarea, self).__init__(*args, **kwargs)
    
    class MyModelAdmin(admin.ModelAdmin):
      formfield_overrides = { models.TextField: {'widget': DifferentlySizedTextarea}}
    
    0 讨论(0)
提交回复
热议问题