Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django: Admin: changing the widget of the field in Admin

I have a model with a boolean value like that:

class TagCat(models.Model):     by_admin = models.BooleanField(default=True)  

This appears as a checkbox in admin.

  1. How could I use this as a radio button in admin?
  2. Also, how do I make it be always with a certain selected value in admin?
  3. Also, I want the default value to be the opposite, when a non-admin user adds a TagCat. This field should be hidden from him.

Can someone tell me how to do this? Django documentation doesn't seem to go in such details.

like image 866
mgPePe Avatar asked Dec 02 '10 16:12

mgPePe


People also ask

How do I override a field in Django admin?

The way to override fields is to create a Form for use with the ModelAdmin object. This didn't work for me, you need to pass an instance of the widget, rather than the class. The instance worked perfectly, though. I typically would create custom admin forms in the admin.py and not mix them in with forms.py.

What a widget is Django how can you use it HTML input elements?

A widget is Django's representation of an HTML input element. The widget handles the rendering of the HTML, and the extraction of data from a GET/POST dictionary that corresponds to the widget. The HTML generated by the built-in widgets uses HTML5 syntax, targeting <!

What we can do in admin portal in Django?

Overview. The Django admin application can use your models to automatically build a site area that you can use to create, view, update, and delete records. This can save you a lot of time during development, making it very easy to test your models and get a feel for whether you have the right data.


2 Answers

UPDATE 1: Code that gets me done with 1) (don't forget tot pass CHOICES to the BooleanField in the model)

from main.models import TagCat from django.contrib import admin from django import forms  class MyTagCatAdminForm(forms.ModelForm):     class Meta:         model = TagCat         widgets = {             'by_admin': forms.RadioSelect         }         fields = '__all__' # required for Django 3.x      class TagCatAdmin(admin.ModelAdmin):     form = MyTagCatAdminForm   admin.site.register(TagCat, TagCatAdmin) 

The radio buttons appear ugly and displaced, but at least, they work

  1. I solved with following info in MyModel.py:
BYADMIN_CHOICES = (     (1, "Yes"),     (0, "No"), )  class TagCat(models.Model):     by_admin = models.BooleanField(choices=BYADMIN_CHOICES,default=1) 
like image 199
mgPePe Avatar answered Sep 28 '22 02:09

mgPePe


There is another way to do this that is, IMO much easier if you want every field of the same type to have the same widget. This is done by specifying a formfield_overrides to the ModelAdmin. For example:

class MyModelAdmin(admin.ModelAdmin):     formfield_overrides = {         models.TextField: {'widget': RichTextEditorWidget},     } 

More in the docs: https://docs.djangoproject.com/en/1.4/ref/contrib/admin/#django.contrib.admin.ModelAdmin.formfield_overrides

UPDATED: Link to Django 2.0 version: https://docs.djangoproject.com/en/2.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin.formfield_overrides

like image 37
joshcartme Avatar answered Sep 28 '22 00:09

joshcartme