Create a hidden field in the admin site

前端 未结 5 760
孤街浪徒
孤街浪徒 2021-01-11 18:57

How can I create a fully hidden field (input and label) in the admin site? I know about the exclude property, but it fully excludes the field from the template,

相关标签:
5条回答
  • 2021-01-11 19:24

    You're giving ModelForm in your example, not ModelAdmin you should be using for admin site.

    Anyway, method of excluding some field is the same: specify it in exclude property:

    class OutForm(ModelForm):
      class Meta:
        exclude = ["reply_to"]
    

    or

    class OutAdmin(ModelAdmin):
      exclude = ["reply_to"]
    

    See Django documentation for details: http://docs.djangoproject.com/en/1.2/ref/contrib/admin/

    0 讨论(0)
  • 2021-01-11 19:28

    In the template, while displaying

    {% for field in form.visible_fields %}
        {{ field.label_tag }} : {{ field }}
    {% endfor %}
    

    It will hide the hidden field labels.

    0 讨论(0)
  • 2021-01-11 19:32

    I found it quite handy to use the 'classes' attribute in fieldsets to hide fields but still leave them in a request. In your model admin you can write

    fieldsets = [
            ('Visible Fields', 
             {'fields': [('name', 'comment'),]}),
            ('Collapsable Fields', 
             {'fields': [('rare_property',)],'classes': ['collapse']}),
            ('Hidden Fields', 
             {'fields': [('magic_property',)],'classes': ['hidden']}),
                ]
    
    0 讨论(0)
  • 2021-01-11 19:37

    Try adding label="" to your ModelChoiceField to make the label an empty string:

    reply_to = forms.ModelChoiceField(queryset=InMessages.objects.all(), label="", widget=forms.HiddenInput)
    
    0 讨论(0)
  • 2021-01-11 19:45

    The Django admin does not support hidden fields yet. There is an open ticket for that: https://code.djangoproject.com/ticket/11277

    However, there are workarounds that don't require jQuery. The admin forms are rendered using admin/includes/fieldset.html. If you override this template, you can inject a CSS class to denote the row for hiding:

    <div class="form-row
        {% if line.fields|length_is:'1' and line.errors %} errors{% endif %}
        {% for field in line %} {{ field.field.name }}
          {% if field.field.is_hidden %} has-hidden-field{% endif %}  # add this part
        {% endfor %}">
    

    this is actually a single line in the file, I've expanded it to make it more readable.

    ( Neat detail: for an StackedInline/TabularInline objects, you can specify the template as variable in Python code. )

    Next, you can hide that row in your CSS:

    .form-row.has-hidden-field {
        display: none;
    }
    

    Which you can load via your admin page:

    {% block extrastyle %}{{ block.super }}
    <link rel="stylesheet" type="text/css" href="{{ STATIC_URL }}mysite/admin.css" />{% endblock %}
    

    or by using the media definition in the modeladmin:

    class Media:
        css = {'all': ('mysite/admin.css',)
    
    0 讨论(0)
提交回复
热议问题