0

I couldn't find a direct answer elsewhere. I created a Group Model and a GroupMember Model. My goal is that a user creates a Group via a form in templates, then automatically in the GroupMember model the fields should be filled. In particular the field is_admin should be 1, although its default value is set to 0. How to tell CreateGroupView to fill the GroupMember model?

views.py

class CreateGroupView(LoginRequiredMixin, CreateView):
    fields = ("name","description")
    model = Group

class SingleGroupView(DetailView):
    model = Group

class ListGroupView(ListView):
    model = Group

models.py

class Group(models.Model):
    name = models.CharField(max_length=255, unique=True)
    slug = models.SlugField(allow_unicode=True, unique=True)
    description = models.TextField(blank=True, default='')
    members = models.ManyToManyField(User,through="ProjectMember")
    
    def __str__(self):
        return self.name

    def save(self, *args, **kwargs):
        self.slug = slugify(self.name)
        super().save(*args, **kwargs)

    def get_absolute_url(self):
        return reverse("groups:single", kwargs={"slug": self.slug})


class GroupMember(models.Model):
    user = models.ForeignKey(User,related_name='user_groups',on_delete=models.CASCADE,)
    group = models.ForeignKey(Group, related_name="memberships",on_delete=models.CASCADE,)
    is_admin = models.BooleanField(default=False)

    def __str__(self):
        return self.user.username

    class Meta:
        unique_together = ("group", "user")

my template to create a Group

  <form class="m-5" method="POST" action="{% url 'groups:create' %}" id="groupForm">
    {% csrf_token %}
    <div class="form-group">
        <label for="id_name">Name</label>
        <input type="text" name="name" maxlength="255" class="form-control" placeholder="Name" title="" required id="id_name">
    </div>
  
    <div class="form-group">
        <label for="id_description">Description</label>
        <textarea name="description" cols="40" rows="10" class="form-control" placeholder="Description" title="" id="id_description"></textarea>
    </div>
    <input type="submit" value="Create" class="btn btn-primary btn-large">
  </form>

the urls.py

urlpatterns = [
    path('', views.ListGroupView.as_view(), name="all"),
    path("new/", views.CreateGroupView.as_view(), name="create"),
    path("group/<slug>/",views.SingleGroupView.as_view(),name="single"),
]
stats con chris
  • 178
  • 1
  • 10
  • You would override the default `form_valid()` as per this issue -> https://stackoverflow.com/questions/32998300/django-createview-how-to-perform-action-upon-save. In normal forms, you'd override the `save()` method, but I guess these CreateViews are different (just an extra tidbit) – Nealium Oct 17 '22 at 18:34

0 Answers0