through relations one manytoonerel many example python django django-models django-forms django-views

python - one - models 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'')