-1

I am not quite sure how manytomany fields work in django. so what i have here is a profile model where in the name field i want to add the username that i will get from the login credentials, and movies will be added from a form that was created using the movie model. I'd like to understand what's wrong in the views.py file here. Thanks enter image description here

enter image description here

my models.py file:

from django.db import models
from django.contrib.auth.models import User

# Create your models here.
class Article(models.Model):
    title = models.CharField(max_length = 200)
    body = models.TextField()
    pub_date = models.DateTimeField('date published')
    likes = models.IntegerField(default = 0)

    def __str__(self):
        return self.title


class Comment(models.Model):
    name = models.CharField(max_length = 200)
    body = models.TextField()
    pub_date = models.DateTimeField('date published')
    article = models.ForeignKey(Article, on_delete=models.CASCADE)

class Language(models.Model):
    name = models.CharField(max_length = 20)

    def __str__(self):
        return self.name

class Framework(models.Model):
    name = models.CharField(max_length = 20)
    language = models.ForeignKey(Language, on_delete=models.CASCADE)

    def __str__(self):
        return self.name

class Movie(models.Model):
    name = models.CharField(max_length = 20)

    def __str__(self):
        return self.name

class Character(models.Model):
    name = models.CharField(max_length = 20)
    movies = models.ManyToManyField(Movie)

    def __str__(self):
        return self.name

class profile(models.Model):
    name = models.ForeignKey(User,on_delete=models.CASCADE, related_name="name")
    # name = models.CharField(max_length = 20)
    movies = models.ManyToManyField(Movie)

    def __str__(self):
        return self.movies

my forms.py file:

from django import forms
from . models import Article, Comment, Movie, Character

class ArticleForm(forms.ModelForm):

    class Meta:
        model = Article
        fields = [
            'title',
            'body',
            'pub_date'
        ]

class CommentForm(forms.ModelForm):

    class Meta:
        model = Comment
        fields = [
            'name',
            'body'
        ]

class MovieForm(forms.ModelForm):

class Meta:
    model = Movie
    fields = [
        'name'
    ]

class CharacterForm(forms.ModelForm):

class Meta:
    model = Character
    fields = [
        'name'
    ]

my views.py file:

from django.shortcuts import render
from django.contrib.auth.models import User
from .models import Movie, Character, profile
from .forms import MovieForm, CharacterForm
# Create your views here.
def characterset(request):
    # form = CharacterForm(request.POST or None)
    # if form.is_valid():
    #     form.save()
    #     form = CharacterForm()

    form2 = MovieForm(request.POST or None)
    if form2.is_valid():
        form2.save()
        form2 = MovieForm()



    context = {
        'form2' : form2
    }

    return render(request, "manytomany/form2.html", context)

def movieset(request):
    current = request.user.username
    print(current)

    modelname = User.objects.get(username=current)
    print(modelname)

    a = profile(name=modelname)
    print(a)


    form = MovieForm(request.POST or None)
    if form.is_valid():
        f = form.save()
        a.movies.add(f)
        a.save()

    # form2 = MovieForm(request.POST or None)
    # if form2.is_valid():
    #     form2.save()
    #     form2 = MovieForm()



    context = {
        'form' : form
    }

    return render(request, "manytomany/form.html", context)

def show(request, id):
    a = Movie.objects.get(id = id)

    c = Character.objects.get(id = id)

    c.movies.add(a)

    return render(request, "manytomany/show.html")
  • Hi welcome to stack overflow! Please consider reading [how to ask](https://stackoverflow.com/help/how-to-ask) and consider editing your question. – FChm Mar 08 '19 at 21:01

1 Answers1

1

Look at the Django page with the error. It references return self.movies this is due to the relationship you established for that particular model.

So whats happening is this:

Profile -> Movies -> Many-To-Many -> Profile

See whats happening here? You're going in circles and broke Django by having a "circular reference". What you could do is remove the offending line:

class profile:
    ...
    __str__(self):
        return self.name # or something like it
William Bright
  • 535
  • 3
  • 7