2016-09-01 4 views
0

В моем проекте каждый пользователь может иметь несколько врагов, как это:Как изменить форму Django перед сохранением?

модели

class EnemyModel(models.Model): 
    name = models.CharField(max_length=128) 
    weapon = models.CharField(max_length=128) 
    related_user = models.ForeignKey(UserProfile) 

class UserProfile(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE) 

Только пользователь может добавить врагов его профиль, так что я сделал вид, как это:

формы

class AddEnemyForm(forms.ModelForm): 
    class Meta: 
     model = EnemyModel 
     exclude = ['related_user'] # only current user 

Моя идея была изменить исключенного поле в представлении, но он не работает:

просмотров

def add_enemy(request): 
    args={} 
    if request.method == "POST": 
     form = AddEnemyForm(request.POST) 
     form.related_user = request.user # error 
     # form.related_user_id = request.user.id # also error 
     if form.is_valid(): 
      form.save() 
      return HttpResponse("<h1>Done!</h1>") 
     else: 
      args.update(csrf(request)) 
      args["form"]=form 
      return render_to_response("add_enemy.html",args) 
    args.update(csrf(request)) 
    args["form"]=AddEnemyForm() 
    return render_to_response("add_enemy.html",args) 

Как изменить форму, прежде чем сэкономить?

ответ

1

Использование form.instance:

def add_enemy(request): 
    args={} 
    if request.method == "POST": 
     form = AddEnemyForm(request.POST) 
     # form.instance is the instance to be saved 
     form.instance.related_user = request.user.userprofile 
     if form.is_valid(): 
      form.save() 
      return HttpResponse("<h1>Done!</h1>") 
     else: 
      args.update(csrf(request)) 
      args["form"]=form 
      return render_to_response("add_enemy.html",args) 
    args.update(csrf(request)) 
    args["form"]=AddEnemyForm() 
    return render_to_response("add_enemy.html",args) 

Обратите внимание, что enemymodel.related_user должен быть UserProfile и request.user является User. Вам нужно использовать request.user.userprofile.

+0

спасибо! – user2449761

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