python - through - one to one relations django




Relación Many-To-Many de Django(categoría) (2)

el principal problema es que no ha guardado el objeto de publicación en la base de datos antes de asignarle la Categoría. así que cambie la vista un poco a esto

def post(request):
if request.method == 'POST':
    form = Post_form(request.POST, request.FILES)
    if form.is_valid():
        post = form.save(commit=False)
        post.user = request.user
        post.save()
        for k in form.cleaned_data['category']:
            p1 = Category.objects.create(title=k)
            p1.save()
            post.category.add(p1)

Mi objetivo es agregar categorías a mi modelo de publicación. Me gustaría poder consultar más tarde todas las publicaciones por categorías diferentes y, a veces, múltiples.

models.py

class Category(models.Model):
    categories = (
        ('1', 'red'),
        ('2', 'blue'),
        ('3', 'black')
    )
    title = models.CharField(max_length=50, blank=True, choices=categories)

class Post(models.Model):
    text = models.CharField(max_length=500)
    category = models.ManyToManyField(Category)

forms.py

class Post_form(forms.ModelForm):

    categories = (
        ('1', 'red'),
        ('2', 'blue'),
        ('3', 'black')
    )
    category = forms.MultipleChoiceField(required=False, widget=forms.CheckboxSelectMultiple,
    choices=categories)

    class Meta:
        model = Post
        fields = (
            'text',
            'category'
        )

Estoy confundido sobre la lógica de guardar un obj antes de que puedas salvar otro.

views.py

def post(request):
    if request.method == 'POST':
        form = Post_form(request.POST, request.FILES)
        if form.is_valid():
            post = form.save(commit=False)
            post.user = request.user

            p1 = Category(form.cleaned_data['category'])
            post.category.add(p1)

        return redirect('home:home')

    else:
        form = Post_form()
        args = {'form': form }
        return render(request, 'home/new_post.html', args)

error:

"<Post: Post object>" needs to have a value for field "id" before this many-to-many relationship can be used.

EDITAR:

form.cleaned_data ['category'] devuelve una lista que causa el problema principal. Ahora mi problema es que mi elección no se guarda en el título de la clase Categoría, el número de selección se guarda en su lugar. Esto es lo que obtuve.

def post(request):
    if request.method == 'POST':
        form = Post_form(request.POST, request.FILES)
        if form.is_valid():
            post = form.save(commit=False)
            post.user = request.user
            post.save()
            for k in form.cleaned_data['category']:
                p1 = Category(title=k)
                p1.save()
                post.category.add(p1)

SOLUCIONADO

views.py

def post(request):
    if request.method == 'POST':
        form = Post_form(request.POST, request.FILES)
        if form.is_valid():
            post = form.save(commit=False)
            post.user = request.user
            post.save()

            for k in form.cleaned_data['category']:
                selection = Category.objects.get(pk=k)
                post.category.add(selection)

            return redirect('home:home')

Edita tu vista así,

if form.is_valid():
    title = form.cleaned_data['category']
    post = form.save(commit=False)
    post.user = request.user
    post.save()
    category = Category.objects.create(title=title)
    post.category.add(category)
    post.save_m2m()
    return redirect('home:home')




django-views