python - 发布表单时 django 错误 "invalid literal for int() with base 10: ' a' "

标签 python django forms

我在提交表单时收到此错误。我知道到底是什么导致了这个错误,但我似乎迷失了这里。实际上,我尝试在我的表单中使用 M2M 字段作为 charfield。根据文档,M2M 字段仅采用有效 ID 列表,并传递文本列表。据我所知,这是错误的主要原因。知道如何摆脱这个错误

我的模型结构为:

class Question(models.Model):
    topic = models.ForeignKey(Topic, null=True, blank=True)
    tag_name = models.ManyToManyField(Tag)
    question = models.CharField(max_length = 200)

class Tag(models.Model):
    tag_name = models.CharField(max_length = 200)

在 forms.py 中我有:

class QuestionForm(forms.ModelForm):
    tag_name = forms.CharField(widget = forms.TextInput)
    class Meta:
        model = Question

    def clean_tag_name(self):
        data  = self.cleaned_data
        tag_name = data.get('tag_name', None)
        if tag_name is not None:
            for tags in tag_name.split(','):
                try:
                    tag = Tag.objects.get(tag_name=tags)
                except Tag.DoesNotExist:
                    tag = Tag.objects.create(tag_name = tags)

        return tag_name

    def save(self, commit=True):
        ints = super(QuestionForm, self).save(commit=commit)
        tags = self.cleaned_data.get('tag_name', None)
        if tags is not None:
            for tag in tags.split(","):
                tag = QuestionForm.objects.create(name=tag_name)
                ints.tag_name.add(tag)
                ints.save()
        return ints

最佳答案

您的代码片段有一些缺陷:

您无法执行 QuestionForm.objects.create(name=tag_name) 因为 QuestionForm 不是模型并且没有 objects 属性.

您可能想编写 Question.objects.create(name=tag_name) 但这不会起作用,因为 Question 没有字段 name 并且此时您没有名为 tag_name 的变量。

此外,在您的 clean() 方法中,您确保用户输入的标签存在于数据库中,但在您的 save() 方法中,您正在尝试将标签名称(如:字符串)而不是标签对象添加到 M2M 字段。你不能那样做。 M2M 字段的 .add() 方法需要 Tag 模型的实例。这意味着,在您的 .save() 方法中,您必须再次拆分标记字符串,然后从数据库中获取 Tag 对象并将这些实例添加到 您刚刚创建的 >Question 实例。

试试这个:

首先更改类元:

class Meta:
    model = Question
    fields = ['topic', 'question']

这可确保表单不会尝试保存 tag_name 字段。这很重要,否则下面的 super() 调用会尝试将 tag1, tag2, foobar 添加到 M2M 字段,这是不可能的(记住,您可以不能将字符串添加到 M2M 字段,您只能添加实例)。

然后更改保存方法:

def save(self, *args, **kwargs):
    obj = super(QuestionForm, self).save(*args, **kwargs)
    tags = self.cleaned_data.get('tag_name', None)
    if tags:
        for tag in tags.split(","):
            tag = Tag.objects.get(tag_name=tag)
            obj.tag_name.add(tag)
    return obj

关于python - 发布表单时 django 错误 "invalid literal for int() with base 10: ' a' ",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27684147/

相关文章:

Django REST Framework GET 检索具有 NAME LIKE %NAME% 的行

python - Linux 上 Django 的 SQL Server 2008/2012 后端模块?

javascript - react 形式的无意状态更新

javascript - 比较两个表单电子邮件字段的值

python - Kubernetes CronJob 运行 Python 脚本

python - 极地 : multiply 2 LazyFrames together by column

python - 如何根据日期时间值获取最近的 json 对象?

python - 将新列写入现有的 xlsx 文件

python - 在 Django 应用程序中,每个用户只允许一个事件 session

Javascript提交表单并重定向当前页面