Python 我的Django表单不允许我保存标签
我目前在我的开发网站上有一个表单,我用它来创建新的帖子。我最近在我的帖子模型中添加了一个标签模型和一个标签字段。然后,我将标签字段添加到我的表单中。但是当我创建一篇文章并选择一个标签并保存它时。除我选择的标记外,所有内容都已保存。这是我的密码 我的模型Python 我的Django表单不允许我保存标签,python,django,Python,Django,我目前在我的开发网站上有一个表单,我用它来创建新的帖子。我最近在我的帖子模型中添加了一个标签模型和一个标签字段。然后,我将标签字段添加到我的表单中。但是当我创建一篇文章并选择一个标签并保存它时。除我选择的标记外,所有内容都已保存。这是我的密码 我的模型 class Post(models.Model): user = models.ForeignKey(settings.AUTH_USER_MODEL, default=1) title = models.CharField
class Post(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, default=1)
title = models.CharField(max_length=120)
slug = models.SlugField(max_length=200, unique=True)
image = models.ImageField(upload_to=upload_location,
null=True,
blank=True,
width_field="width_field",
height_field="height_field")
height_field = models.IntegerField(default=0)
width_field = models.IntegerField(default=0)
content = models.TextField()
draft = models.BooleanField(default=False)
publish = models.DateField(auto_now=False, auto_now_add=False)
timestamp = models.DateTimeField(auto_now=False, auto_now_add=True)
updated = models.DateTimeField(auto_now=True, auto_now_add=False)
tags = models.ManyToManyField(Tag)
objects = PostManager()
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse("posts:detail", kwargs={"slug": self.slug})
class Meta:
ordering = ["-timestamp", "-updated"]
class Tag(models.Model):
title = models.CharField(max_length=250)
slug = models.SlugField(max_length=200, unique=True)
timestamp = models.DateTimeField(auto_now=False, auto_now_add=True)
updated = models.DateTimeField(auto_now=True, auto_now_add=False)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse("posts:tag_index", kwargs={"slug": self.slug})
class Meta:
ordering = ["-timestamp"]
我的表格.py
from django import forms
from .models import Post
class PostForm(forms.ModelForm):
class Meta:
model = Post
fields = [
"title",
"content",
"image",
"draft",
"publish",
"tags"
]
我的看法
def post_create(request):
if not request.user.is_staff or not request.user.is_superuser:
raise Http404
form = PostForm(request.POST or None, request.FILES or None)
if form.is_valid():
instance = form.save(commit=False)
instance.save()
messages.success(request, "Created !!")
return HttpResponseRedirect(instance.get_absolute_url())
template = "posts/post_form.html"
context = {
"form": form
}
return render(request, template, context)
my post form.html
{% extends 'posts/base.html' %}
{% load crispy_forms_tags %}
{% block content %}
<div class="col-sm-6 col-sm-offset-3">
<h1>
Form
</h1>
<form method="POST" action="" enctype="multipart/form-data">{% csrf_token%}
{{ form|crispy}}
<input type="submit" value="Create Post" class="btn btn-default">
</form>
</div>
{% endblock content %}
欢迎任何和所有指导您必须使用save_m2m保存多对多字段 所以基本上:
instance = form.save(commit=False)
instance.save()
instance.save_m2m()
:
要解决此问题,每次使用
commit=False,Django将save_m2m方法添加到您的模型表单中
子类。手动保存由生成的实例后
表单,您可以调用savem2m来保存多对多表单数据
请注意,仅当确实提交=False时才需要save_m2m。如果只执行form.save,所有数据(包括多对多数据)都将成功保存您必须使用save_m2m保存多对多字段 所以基本上:
instance = form.save(commit=False)
instance.save()
instance.save_m2m()
:
要解决此问题,每次使用
commit=False,Django将save_m2m方法添加到您的模型表单中
子类。手动保存由生成的实例后
表单,您可以调用savem2m来保存多对多表单数据
请注意,仅当确实提交=False时才需要save_m2m。如果只执行form.save,所有数据(包括多对多数据)都将成功保存请注意,这里完全不需要commit=False,因为这是问题的原因。@DanielRoseman感谢您的回复。我在听一个教程,他为什么要支持那个论点?commit=False的原因是什么。感谢您在将实例保存到db之前对其执行其他操作时使用的响应,例如从请求中添加当前用户。您没有这样做,所以没有必要使用它。@DanielRoseman谢谢,我很感激。请注意,造成您问题的commit=False在这里是完全不必要的。@DanielRoseman感谢您的回复。我在听一个教程,他为什么要支持那个论点?commit=False的原因是什么。感谢您在将实例保存到db之前对其执行其他操作时使用的响应,例如从请求中添加当前用户。“你没有这样做,所以没有必要使用它。”丹尼尔罗斯曼谢谢,谢谢你的回复。我试图通过添加instance.save_m2munderneath您拥有的方式保存它,但它给了我一个错误AttributeError:“Post”对象没有属性“save_m2m”,但是如果我从我使用的方式中删除commit=False,它就会工作。save_m2m是表单上的一个方法,而不是模型实例。感谢您的响应。我试图通过添加instance.save_m2munderneath您拥有的方式来保存它,但它给了我一个错误AttributeError:“Post”对象没有属性“save_m2m”,但如果我从我使用的方式中删除commit=False,它将工作,save_m2m是表单上的一个方法,而不是模型实例。