Search code examples
djangodjango-modelsdjango-admindjango-grappelli

grappelli to hide Sortable field in Inline sortable (Django Admin)


From the grappelli customization document, it suggested that:

    The sortable-field will not automatically be hidden
 (use a Hidden Input Widget if needed).

However, i have searched for so long and have no idea on what is a "Hidden Input Widget" and how i could be implemented to a Django model. Here is my code:

     # models.py
class video(models.Model):
    category = models.ForeignKey(subCategory)
    index = PositionField('index')
    video_title = models.CharField(max_length=255, blank=True, null=True)
    video_desc = models.TextField(blank=True, null=True)
    main_img = S3EnabledImageField(upload_to='video_img', blank=True, null=True)
    small_img = S3EnabledImageField(upload_to='video_img', blank=True, null=True)
    mid_img = S3EnabledImageField(upload_to='video_img', blank=True, null=True)
    large_img = S3EnabledImageField(upload_to='video_img', blank=True, null=True)
    last_updated = models.DateField(auto_now=True)
    date_added = models.DateField()
    date_modified = models.DateField()
    date_published = models.DateField(blank=True, null=True)
    date_closed = models.DateField(blank=True, null=True)
    status = models.CharField(max_length=7,choices=STATUS_CHOICE)

    class Meta:
        ordering = ('index',)
        verbose_name = 'Video'
        verbose_name_plural = 'Video'

    def __unicode__(self):
        return self.video_title

class video_file(models.Model):
    video = models.ForeignKey(video)
    index = models.PositiveIntegerField()
    file_title = models.CharField(max_length=255, blank=True, null=True)
    #main_file = models.ImageField(upload_to='phoneso/video_file', blank=True, null=True)
    main_file = S3EnabledFileField(upload_to='video_file')
    resolution = models.CharField(max_length=50, blank=True, null=True)
    file_format = models.CharField(max_length=50, blank=True, null=True)
    date_added = models.DateField(auto_now_add=True)
    date_published = models.DateField(auto_now_add=True)
    status = models.CharField(max_length=7,choices=STATUS_CHOICE)

    class Meta:
        ordering = ('index',)
        verbose_name = 'Video File'
        verbose_name_plural = 'Video File'

    def __unicode__(self):
        return self.video.video_title

# admin.py

class video_fileInline(admin.TabularInline):
    fields = ('main_file' , 'resolution' , 'file_format' , 'status', 'index',)
    sortable_field_name = 'index'
    model = video_file
    extra = 1

class videoAdmin(admin.ModelAdmin):
    list_display = ('index' ,  'video_title', 'category' , 'date_added' , 'date_published' , 'status')
    search_fields = ['video_title', 'desc']
    readonly_fields = ('date_added','date_modified')
    list_filter = ['category']
    inlines = [video_fileInline]

class video_fileAdmin(admin.ModelAdmin):
    list_display = ('index' ,  '__unicode__' , 'file_title', 'resolution' , 'file_format' , 'main_file' , 'date_added' , 'date_published' , 'status')
    search_fields = ['video_title', 'desc']

Where should i implemented the suggested "Hidden Input Widget"?

Thank you.


Solution

  • You can write a form for your model and use it in video_fileInline:

    forms.py

    class VideoFileForm(forms.ModelForm):
        def __init__(self, *args, **kwargs):
            super(VideoFileForm, self).__init__(*args, **kwargs)
            # key should be your sortable-field - in your exaple it's *index*
            self.fields['index'].widget = forms.HiddenInput()
    
        class Meta:
            model = video_file
    

    admin.py

    class video_fileInline(admin.TabularInline):
        fields = ('main_file' , 'resolution' , 'file_format' , 'status', 'index',)
        form = VideoFileForm
        sortable_field_name = 'index'
        model = video_file
        extra = 1