Django:如何从视图中向表单传递变量/参数?
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/')
问题的出现原因:在Django中,当我们从视图中创建modelform时,有时需要将变量或参数传递给表单。在上述问题中,用户想要知道如何将变量传递给表单的初始值。
解决方法:根据Django的文档,我们可以在创建modelform时使用initial参数来传递变量或参数。具体的解决方法如下:
form = SomeModelForm(request.POST, initial={"option": "10"})
这样,我们可以将option参数的初始值设置为10。需要注意的是,or None这部分其实是不需要的。虽然request.POST在GET请求时是一个空字典,与None在表单初始化方法中的处理方式不同。所以请仔细阅读Django的文档。
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中向表单传递变量或参数的方法。