Django:如何从视图中向表单传递变量/参数?

29 浏览
0 Comments

Django:如何从视图中向表单传递变量/参数?

我有一个如下所示的模型:\n

class TankJournal(models.Model):
    user = models.ForeignKey(User)
    tank = models.ForeignKey(TankProfile)
    ts = models.IntegerField(max_length=15)
    title = models.CharField(max_length=50)
    body = models.TextField()

\n我还有一个针对上述模型的模型表单,如下所示:\n

class JournalForm(ModelForm):
    tank = forms.IntegerField(widget=forms.HiddenInput()) 
    class Meta:
        model = TankJournal
        exclude = ('user','ts')

\n我想知道如何为那个隐藏字段设置默认值。这是我目前用来显示/保存表单的函数:\n

def addJournal(request, id=0):
    if not request.user.is_authenticated():
        return HttpResponseRedirect('/')
    # 检查他们是否拥有该坦克
    from django.contrib.auth.models import User
    user = User.objects.get(pk=request.session['id'])
    if request.method == 'POST':
        form = JournalForm(request.POST)
        if form.is_valid():
            obj = form.save(commit=False)
            # 设置用户和时间戳
            from time import time
            obj.ts = int(time())
            obj.user = user
            obj.tank = TankProfile.objects.get(pk=form.cleaned_data['tank_id'])
            # 保存数据
            obj.save()
    else:
        form = JournalForm()
    try:
        tank = TankProfile.objects.get(user=user, id=id)
    except TankProfile.DoesNotExist:
        return HttpResponseRedirect('/error/')

0
0 Comments

问题的出现原因:在Django中,当我们从视图中创建modelform时,有时需要将变量或参数传递给表单。在上述问题中,用户想要知道如何将变量传递给表单的初始值。

解决方法:根据Django的文档,我们可以在创建modelform时使用initial参数来传递变量或参数。具体的解决方法如下:

form = SomeModelForm(request.POST, initial={"option": "10"})

这样,我们可以将option参数的初始值设置为10。需要注意的是,or None这部分其实是不需要的。虽然request.POST在GET请求时是一个空字典,与None在表单初始化方法中的处理方式不同。所以请仔细阅读Django的文档。

0
0 Comments

问题原因:

该问题的出现是因为在Django中,当我们需要将一个变量或参数传递到表单中时,需要在视图中进行相应的设置。然而,某些情况下,我们可能需要在创建表单后才能设置初始值,例如当用户返回页面进行编辑时。

解决方法:

一种解决方法是在创建表单后设置初始值。我们可以使用以下代码来实现:

form.fields['tank'].initial = 123

这种方法允许我们在表单创建后动态地设置初始值。通过将特定字段的初始值设置为我们想要的值,我们可以确保在用户返回页面进行编辑时,初始值是动态的,而不是之前保存的值。

0
0 Comments

Django中,有时候我们需要将变量或参数传递给表单(form)。下面的内容给出了一种解决方法。

可以使用Form.initial来设置表单的初始值。可以通过两种方式来实现,一种是在调用表单构造函数时指定初始值,另一种是在表单定义中设置初始值。

第一种方式,在调用表单构造函数时传入initial参数:

form = JournalForm(initial={'tank': 123})

第二种方式,在表单定义中设置初始值:

tank = forms.IntegerField(widget=forms.HiddenInput(), initial=123)

需要注意的是,initial参数不是默认值。当表单已经被绑定时,初始值不会生效。

评论中提到,初始值的设定也可以在表单定义中通过设置默认值来实现。只有在需要动态值作为默认值时(例如用户输入、登录信息、地理位置等),才需要使用initial参数。

还有一个使用场景是,在发送注册链接时,如果希望在注册表单中预填充电子邮件、ID或其他凭证,这时无法在模型中进行设置,因为这些值是动态的。可以通过调用构造函数,并传入initial参数来实现预填充。

另外,不要去重写View.get_form来设置初始数据。对于任何使用FormMixin的类视图(基本上所有用于创建或编辑数据的类视图),可以使用类级initial变量(用于设置不变的默认值)或重写FormMixin.get_initial()方法,返回一个包含初始值的字典,该字典将传递给表单的构造函数(用于设置动态默认值)。

以上就是在Django中向表单传递变量或参数的方法。

0