2014-11-12 2 views
0

интересно, может ли кто-нибудь помочь мне. Я пытаюсь написать форму и представление, которое добавляет новые профили пользователей в мою базу данных. Модель User имеет поле ManyToMany, указывающее на таблицу под названием «Интерес», что позволяет пользователям выбирать интересы, которые у них есть.ManyToMany Fields, вызывающие недопустимые аргументы ключевых слов

Модели

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(), 
    } 

Кто-нибудь есть способ сделать это приста k правильно и разрешить мне создавать новых пользователей?

Большое спасибо!

ответ

0

Как сказано в сообщении об ошибке, поля «многие ко многим» недействительны в качестве аргументов ключевого слова при создании экземпляра модели, потому что на самом деле они ссылаются на отдельную таблицу ссылок, и экземпляры, к которым они относятся, уже должны быть сохранены.

Однако вам не нужно делать это вручную. Одним из целых моментов использования ModelForm является то, что он имеет метод save, который по необходимости ставит все поля, включая m2m, если это необходимо.

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

Однако опять же, вы должны никогда, никогда не использовать то, что вы сделали здесь. Вы храните пароли в текстовом виде, и это серьезное серьезное отверстие безопасности. Для этого нет оснований: Django включает в себя систему проверки подлинности, которая заботится о хэшировании ваших паролей для вас и легко расширяется. Используйте это вместо этого.

+0

Удивительный, спасибо огромное Даниэлю! – MrW