Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Getting an error of "<Team: jaja>" needs to have a value for field "id" before this many-to-many relationship can be used

I’m trying to add team to the database but i get this error. Took a look at similar questions but none of them solved my issue. (I am new with Django)

My code looks like:

forms.py

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

from django.forms import ModelForm
from .models import Team


class TeamForm(ModelForm):


    class Meta:
        model = Team
        fields = ['title', 'team_country', 'team_logo']

    def __init__(self, *args, **kwargs):
        super(TeamForm, self).__init__(*args, **kwargs)

        for name, field in self.fields.items():
            field.widget.attrs.update({'class': 'input'})

models.py

from django.db import models

# Create your models here.
from django.contrib.auth.models import User
from django_countries.fields import CountryField
from .validators import validate_file_size


class Team(models.Model):
    #
    # Status

    ACTIVE = 'active'
    DELETED = 'deleted'

    CHOICES_STATUS = (
        (ACTIVE, 'Active'),
        (DELETED, 'Deleted')
    )    

    #
    # Fields

    title = models.CharField(max_length=255)
    team_country = CountryField(blank=True, null=True)    
    team_logo = models.ImageField(
        null=True, blank=True, upload_to='logos/', default="logos/logo.png",
        validators=[validate_file_size])
    members = models.ManyToManyField(User, related_name='teams')
    created_by = models.ForeignKey(User, related_name='created_teams', on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)
    status = models.CharField(max_length=10, choices=CHOICES_STATUS, default=ACTIVE)

    class Meta:
        ordering = ['title']
    
    def __str__(self):
        return self.title

views.py

from django.shortcuts import render
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.shortcuts import render, redirect, get_object_or_404


from .models import Team

@login_required
def add(request):
    profile = request.user.profile
    form = TeamForm()
    if request.method == 'POST':
        form = TeamForm(request.POST, request.FILES)

        if form.is_valid():
            team = form.save(commit=False)
            team.created_by = request.user
            team.members.add(request.user)
            team.save()

            
            profile.active_team_id = team.id
            profile.save()

            return redirect('account')

    context = {'form': form}
    return render(request, 'team/add.html', context)

When I try to do it without forms like for example with only title field:

@login_required
def add(request):
    if request.method == 'POST':
        title = request.POST.get('title')

        if title:
            team = Team.objects.create(title=title, created_by=request.user)
            team.members.add(request.user)
            team.save()

            userprofile = request.user.profile
            userprofile.active_team_id = team.id
            userprofile.save()

            return redirect('account')
    
    return render(request, 'team/add.html')

It is successfully adds it. What am I doing wrong in here?

>Solution :

You cannot add a member to group that does not yet exist, so you need to add the user after the group has been created for example :

 if form.is_valid():
        team = form.save(commit=False)
        team.created_by = request.user
        team.members.add(request.user)
        team.save()

is now :

 if form.is_valid():
        team = form.save(commit=False)
        team.created_by = request.user
        team.save()
        team.members.add(request.user) # you can only add member after the group has been created

Same in the second snippet :

team = Team.objects.create(title=title, created_by=request.user)
        team.save()
        team.members.add(request.user)
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading