Django - 预先填充的隐藏字段

时间:2013-06-04 19:00:09

标签: python django django-forms django-views

在我的用户注册过程中,用户首先创建他们的帐户,然后创建一个LIST对象,然后将其定向到他们刚刚创建的LIST对象的仪表板。为此,我需要能够访问最近创建的LIST对象的list_id,以便将其传递给下一个视图/模板。 list_id是LIST表/类的主键,因此我不希望用户为此创建值 - 它会自动递增。以下是模型中的字段:

class List(models.Model):
    list_id = models.IntegerField(primary_key=True)

来自MySQL的list_id的描述:

+---------------+--------------+------+-----+---------+----------------+
| Field         | Type         | Null | Key | Default | Extra          |
+---------------+--------------+------+-----+---------+----------------+
| list_id       | int(11)      | NO   | PRI | NULL    | auto_increment |

以下是观点:

@login_required
@permission_required('social_followup.add_list')
def user_create(request):
    if request.method == 'POST':
        list_form = forms.ListForm(request.POST)
        if list_form.is_valid():
            list_create = list_form.save()
            messages.success(request, 'List {0} created'.format(list_create.list_id))
            up, _ = UserProfile.objects.get_or_create(user=request.user, list_id=list_create)
            return redirect(reverse('user_dashboard', args=(2,)))  # 2 is just an example
    else:
        list_form = forms.ListForm()

    return TemplateResponse(request, 'dashboard/create.html', {'list_form': list_form, })

但是,我发现当我不将list_id作为表单的一部分包含时,我无法访问该attribite(当list_id不是字段时,执行list_create.list_id会返回None)。在我的模板中,我将list_id字段隐藏起来:

<div class="control-group {% if list_form.list_id.errors %}error{% endif %}">
    <div class="controls">
        {{ list_form.list_id.as_hidden }}
    </div>
</div>

由于list_id是必需和隐藏的,因此表单不会验证,因为list_id没有值。但是,如果我将list_id删除为字段,我似乎无法访问视图中的list_id属性。有没有办法自动填充此字段与下一个list_id应该是什么,以便我可以使用list_create.list_id获取值,并保持字段隐藏?或者还有另一种方法来实现这一目标吗?

1 个答案:

答案 0 :(得分:1)

在调用.save()之前,主键不存在。如果要在保存表单后稍后访问PK,可以通过传递到模板来访问它

list_form = forms.ListForm(instance=list_create)

然后在你的模板中

{{list_form.instance.id}}