saroj paudel
saroj paudel

Reputation: 25

Choice Field with Radio button not appearing on the admin panel

This is my passsenger model. When I go to my default django model, I can see every fields but not the choice field. I want the option to select the gender of the patient. ALso, I want this in my form. But, there is no field name Gender in my admin panel in the first place. What is the issue??

class Passenger(models.Model):
    # book_id = models.OneToOneField(Booking, on_delete = models.CASCADE, primary_key = True)
    First_name = models.CharField(max_length=200, unique=True)
    Last_name = models.CharField(max_length=200, unique=True)
    Nationality = models.CharField(max_length=200, unique=True)
    Passport_No = models.CharField(max_length=200, unique=True)
    Passport_Exp_Date = models.DateField(blank=False)
    Contact_Number = models.CharField(max_length=200, unique=True)
    Email = models.EmailField(max_length=200, unique=True)
    Customer_id = models.CharField(max_length=50)
    CHOICES = [('M', 'Male'), ('F', 'Female'), ('O', 'Others')]
    Gender = forms.ChoiceField(label='Gender', widget= forms.RadioSelect(choices=CHOICES))

Upvotes: 0

Views: 817

Answers (1)

ruddra
ruddra

Reputation: 51998

You need to create a ModelForm and use it to override ModelAdmin.form for showing radio buttons in admin site, like this:

# models.py
class Passenger(models.Model):
   # rest of the fields
   CHOICES = [('M', 'Male'), ('F', 'Female'), ('O', 'Others')]
   Gender = models.CharField(max_length=50,choices=CHOICES)  # field name should be gender(all lowercase)

# admin.py
class PassengerForm(forms.ModelForm):
    class Meta:
        model = Passenger
        fields = '__all__'

    Gender = froms.ChoiceField(
        label = 'Gender',
        choices = [('M', 'Male'), ('F', 'Female'), ('O', 'Others')]
        initial = 'M',
        widget = forms.RadioSelect,
    )

class PassengerAdmin(admin.ModelAdmin):
     form = PassengerForm
 
admin.site.register(Passenger, PassengerAdmin)

FYI: As per PEP-8 standard, attribute names should be snake_case.

Update

Try like this using radio_fields:

class PassengerAdmin(admin.ModelAdmin):
     radio_fields = {"Gender": admin.VERTICAL}
 
admin.site.register(Passenger, PassengerAdmin)

Upvotes: 3

Related Questions