ManyToMany字段导致无效的关键字参数

时间:2014-11-12 17:53:29

标签: python django django-models django-forms django-views

想知道是否有人可以帮助我。我正在尝试编写一个表单和视图,将新的用户配置文件添加到我的数据库中。 User模型有一个ManyToMany字段,指向一个名为' Interest'的表,这允许用户选择他们拥有的兴趣。

模型

class Interest(models.Model):
    title = models.TextField()



class User(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=40)
    date_of_birth = models.DateField()
    email = models.EmailField()
    password = models.CharField(max_length=32)
    course = models.ForeignKey(Course)
    location = models.ForeignKey(Location)
    interests = models.ManyToManyField(Interest)
    bio = models.TextField(blank=True)

查看

def add_user(request):
if request.method == 'POST':
    form = AddUserForm(request.POST)
    if form.is_valid():
        cd = form.cleaned_data
        submission = User(
            first_name=cd['first_name'],
            last_name=cd['last_name'],
            date_of_birth=cd['date_of_birth'],
            email=cd['email'],
            password=cd['password'],
            course=cd['course'],
            location=cd['location'],
            interests=cd['interests'], #Line that is causing errors
            bio=cd['bio']
        )
        submission.save()
        return HttpResponseRedirect('/add-user/')
else:
    form = AddUserForm()
return render(request, 'adduser.html', {'form': form})

表格

class AddUserForm(forms.ModelForm):
class Meta:
    model = User
    fields = [
        'first_name',
        'last_name',
        'date_of_birth',
        'email',
        'password',
        'course',
        'location',
        'interests',
        'bio',
        ]
    widgets = {
        'password': forms.PasswordInput(),
    }

有没有人有办法让这项工作正常并允许我创建新用户?

非常感谢!

1 个答案:

答案 0 :(得分:0)

正如错误所述,当您实例化模型时,多对多字段无效作为关键字参数,因为实际上它们引用了单独的链接表,并且必须已经保存它们相关的实例。

但是,您不需要手动执行此操作。使用ModelForm的一个重点是它有一个save方法,它负责设置所有字段,包括必要时的m2m。

if form.is_valid():
    submission = form.save()
    return HttpResponseRedirect('/add-user/')

然而,您必须永远不会使用您在此处所做的事情。您以纯文本格式存储密码,这是一个严重的安全漏洞。也没有理由这样做:Django包含一个身份验证框架,负责为您提供哈希密码,并且易于扩展。请改用它。