Reputation: 25
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
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
.
Try like this using radio_fields
:
class PassengerAdmin(admin.ModelAdmin):
radio_fields = {"Gender": admin.VERTICAL}
admin.site.register(Passenger, PassengerAdmin)
Upvotes: 3