Django:具有条件的ModelForm [英] Django : ModelForm with conditions

查看:203
本文介绍了Django:具有条件的ModelForm的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试创建一个表单变量。作为默认玩家有0级,他可以改变是名字。后来当他是1级时,他可以改变是名字,就是头像。当他是3级时,他可以改变是名字,就是头像,就是工作。等等...

I'm trying to create a form variable. As default Player have the level 0 and he can just change is name. Later when he is level 1, he can change is name and is avatar. When he is level 3, he can change is name, is avatar and is job. Etc...

Models.py:

class Player(models.Model):
    level = models.SmallIntegerField(default=0) 
    name = models.CharField(max_length=50)
    avatar = models.URLField(default='http://default-picture.com/01.png')
    job =  models.TextField(null=True)

Fomrs.py:

class ProfileForm(forms.ModelForm):

class Meta:
    model = Player
    fields = ['name', 'avatar', 'job']
    widgets = {
        'name': forms.TextInput(),
        'avatar': forms.TextInput(),
        'job': forms.Textarea(),
    }

Views.py:

def game(request, id):
    user = get_object_or_404(Player, id=id)
    if request.method == 'POST':
        form = ProfileForm(request.POST, instance=user)
        if form.is_valid():
            form.save()
            return HttpResponse('Success')
    else:
        form = ProfileForm(instance=user)
    return render(request, "page/template.html",
            {'form': form})

模板.html:

{{ form }}

可以在将表单的渲染发送到render engime之前添加条件?或者我需要在我的模板中做条件?

It's possible to add condition for the render of the form before send it to the render engime ? Or I need to do it in my Template with conditions ?

我只是在允许实例对象具有或多或少的这些参数之一(在

I just when to allow the instanced object to have more or less positibilies in terms of one of these parameters (in the exemple is the level of the player).

推荐答案

您可以覆盖表单的 __ init __ 方法有条件地删除或禁用字段:

You can overwrite the form's __init__ method to remove or disable fields conditionally:

class ProfileForm(forms.ModelForm):
    ...
    def __init__(self, *args, **kwargs):
        super(ProfileForm, self).__init__(*args, **kwargs)
        if self.instance and self.instance.level < 3:
            self.fields['job'].disabled = True # still displays the field in the template
            # del self.fields['job'] # removes field from form and template
        if self.instance and self.instance.level < 1:
            self.fields['avatar'].disabled = True

这篇关于Django:具有条件的ModelForm的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆