1

In my project each user can have multiple enemies, like this:

models

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) 

Only user can add enemies to his profile, so I made a form like this:

forms

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

My idea was to modify the excluded field in a view, but it doesn't work:

views

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) 

How to modify a form before save?

1 Answer 1

3

Use 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) 

Note that enemymodel.related_user should be a UserProfile, and request.user is a User. You need to use request.user.userprofile.

Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.