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'')