簡體   English   中英

如何在保存之前修改Django表單?

[英]How to modify Django form before save?

在我的項目中,每個用戶都可以有多個敵人,如下所示:

楷模

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)

如何在保存之前修改表單?

使用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應為UserProfilerequest.userUser 您需要使用request.user.userprofile

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM