As, the contact model has been created, now it can be assigned as a many to many field to the Workshop Model, to store contact information.
Instead of assigning to the Workshop Model, we can assign this to the AbstractEventModel as all the events would have some point of contact for queries and it would be better to add that as a common thing in it.
class AbstractEvent(models.Model):
name = models.CharField(max_length=500, unique=True)
website_link = models.CharField(max_length=1000, blank=True, null=True)
target_audience = models.CharField(max_length=1000,null=True, blank=True)
event_type = models.CharField(max_length=100, choices=[("offline", "Offline"),("online", "Online"), ("both", "Both")], default="offline")
mail_id = models.EmailField()
start_date = models.DateTimeField()
end_date = models.DateTimeField()
registration_start_date = models.DateTimeField()
registration_end_date = models.DateTimeField()
department = models.ForeignKey(Department, on_delete=models.CASCADE)
slug = models.SlugField(max_length=150, unique=True, blank=True)
poster = models.ImageField(upload_to='event_poster/', blank=True, null=True)
on_spot_registration = models.BooleanField(default=False)
max_registrations = models.PositiveIntegerField(null=True, blank=True)
contacts = models.ManyToManyField(Contact)
created_at = models.DateTimeField(auto_now_add=True)
modified_at = models.DateTimeField(auto_now=True)
class Meta:
abstract = True
def save(self, *args, **kwargs):
if not self.slug:
self.slug = slugify(f"{self.name}")
super().save(*args, **kwargs)
def __str__(self):
return self.name
So, the contacts field is added as a ManyToManyField, and now the migrations need to be applied in order to make the changes in the database.
python manage.py makemigrations
python manage.py migrate
After this, the event/admin.py
file needs to be changed to add the contact information.
@admin.register(Workshop)
class WorkshopAdmin(AbstractEventAdmin):
list_display = ('workshop_title', 'venue',)+AbstractEventAdmin.list_display
search_fields = AbstractEventAdmin.search_fields + ['workshop_title', 'venue']
fieldsets = (
('Basic Information', {
'fields': ('name', 'slug', 'website_link', 'mail_id', 'on_spot_registration', 'max_registrations')
}),
('Workshop Details', {
'fields': ('workshop_title', 'venue', 'target_audience', 'event_type', "department", 'poster', 'contacts')
}),
('Dates', {
'fields': ('start_date', 'end_date', 'registration_start_date', 'registration_end_date',)
}),
)
def get_queryset(self, request):
qs = super().get_queryset(request)
if not request.user.is_superuser:
qs=qs.filter(department = request.user.hodprofile.department)
return qs
In the WorkshopAdmin class, contacts is added inside the Workshop Details field in the fieldsets.
After this change, the admin panel will look like this :
To make the ManyToManyField more easy to select and view, it can be added inside the filter_horizontal
.
class AbstractEventAdmin(admin.ModelAdmin):
list_display = ('name', 'event_type', 'on_spot_registration','max_registrations','start_date', 'end_date', 'registration_start_date', 'registration_end_date', 'created_at', 'modified_at')
search_fields = ['name',]
list_filter = ['event_type', 'start_date', 'end_date', 'registration_start_date', 'registration_end_date', 'created_at', 'modified_at']
autocomplete_fields = ['department']
filter_horizontal = ['contacts']
prepopulated_fields = {'slug': ('name',)}
After this, the admin panel will change as follows :