Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我的Django表单不允许我保存标签_Python_Django - Fatal编程技术网

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是表单上的一个方法,而不是模型实例。