2016-03-19 4 views
1

У меня есть два поля моделей (хобби и языки), которые не сохраняются, когда пользователь отправляет форму. Их много для многих областей, связанных с отдельными моделями. Но я не уверен, как их сохранить в модели.Два поля не сохраняются после отправки формы. Django

Это модель:

# this is model for user 
class UserProfile(models.Model): 
    user = models.OneToOneField(User, related_name='profile') 

    hobbies = models.ManyToManyField(Hobby) 
    languages = models.ManyToManyField(Language) 

    profilepic = models.ImageField(upload_to='static/images/Profile Pictures', blank=True) 
    city = models.ForeignKey(City) 
    slug = models.SlugField(unique=True) 

    average_rating = models.IntegerField(default=0) 
    ratings_count = models.IntegerField(default=0) 

    def save(self, *args, **kwargs): 
     # Uncomment if you don't want the slug to change every time the name changes 
     self.slug = slugify(self.user.username) 
     super(UserProfile, self).save(*args, **kwargs) 

    def __unicode__(self): 
     return self.user.username 

Это хобби и языковые модели:

# this is the model for hobbies - one to many relationship with User 
class Hobby(models.Model): 
    hobby = models.CharField(max_length=128) 

    def save(self, *args, **kwargs): 
     # if self.id is None: 
     # self.slug = slugify(self.name) 
     self.slug = slugify(self.hobby) 
     super(Hobby, self).save(*args, **kwargs) 

    def __unicode__(self): 
     return self.hobby 

# this is the model for languages - one to many relationship with User 
class Language(models.Model): 
    language = models.CharField(max_length=128) 

    def save(self, *args, **kwargs): 
     # if self.id is None: 
     # self.slug = slugify(self.name) 
     self.slug = slugify(self.language) 
     super(Language, self).save(*args, **kwargs) 

    def __unicode__(self): 
     return self.language 

Это мнение, что сохраняет данные формы в базу данных:

def createprofile(request): 

    registered = False 
    if request.method == 'POST': 
     user = User.objects.get(username = request.user.username) 
     user_form = UserForm(data=request.POST, instance = user) 

     profile_form = UserProfileForm(data=request.POST) 



     if user_form.is_valid() and profile_form.is_valid(): 
      user = user_form.save() 
      user.save() 

      profile = profile_form.save(commit=False) 
      profile.user = user 



      if 'profilepic' in request.FILES: 
       profile.profilepic = request.FILES['profilepic'] 

      profile.save() 

      registered = True 

      if 'next' in request.GET: 
       return redirect(request.GET['next']) 

     else: 
      print user_form.errors, profile_form.errors 



    else: 
     user_form = UserForm() 
     profile_form = UserProfileForm() 

    return render(request, 
      'createprofile.html', 
      {'user_form': user_form, 'profile_form': profile_form, 'registered': registered}) 

ответ

1

При использовании commit = False в вашем методе сохранения Django предоставляет метод save_m2m для создания отношения.

https://docs.djangoproject.com/en/1.9/topics/forms/modelforms/#the-save-method

Как заявил Django документы по ссылке выше:

Другой побочный эффект использования фиксации = False видно, когда ваша модель имеет много-ко-многим с другой моделью. Если ваша модель имеет отношение «многие ко многим», и вы указываете commit = False при сохранении формы, Django не может сразу сохранить данные формы для отношения «многие ко многим». Это связано с тем, что невозможно сохранить данные «много ко многим» для экземпляра, пока экземпляр не будет существовать в базе данных.

Смежные вопросы