Django通过填充在hiddeninput中传递对象ID

时间:2013-05-21 11:04:44

标签: django

我有一个允许用户编辑对象描述的表单。 如何在表单的隐藏输入值中填充对象ID。 到目前为止我所做的是在forms.py中添加了一个名为hidden_​​field的字段,但它只显示了hidden_​​field。如何将hidden_​​field与对象ID

链接

models.py

class School(models.Model):


    user = models.ForeignKey(User)
    name = models.CharField(max_length=55)
    description = models.CharField(max_length=300,blank=True)

forms.py

class SchoolDescriptionForm(forms.ModelForm):
        description = forms.CharField(widget=forms.Textarea,max_length=300)
        hidden_field = forms.CharField(widget=forms.HiddenInput())
    class Meta:
        model = School 
        fields = ()

views.py

def SchoolEditor(request,school_id):


    school = School.objects.get(pk=school_id,user=request.user)
    form = SchoolDescriptionForm(instance=school) # I want to populate the object ID 

    return render(request,'schooleditor.html',{'school':school,'form':form})

模板

 <form method="POST" enctype="multipart/form-data">
     {% csrf_token %}
    {{ form.as_p }}

    <input type = "submit" value= "save" />
{{ form.field.as_hidden }}
 </form>

2 个答案:

答案 0 :(得分:3)

将hidden_​​field更改为id并告诉Django包含学校的id。

class SchoolDescriptionForm(forms.ModelForm):
        description = forms.CharField(widget=forms.Textarea,max_length=300)
        id          = forms.CharField(widget=forms.HiddenInput())
    class Meta:
        model = School 
        fields = ('id', 'name', 'description')

修改

如果您想将hidden_​​field保存为名称,则应添加自定义init方法:

def __init__(self, *args, **kwargs):
    super(SchoolDescriptionForm, self).__init__(*args, **kwargs)
    if self.instance:
        self.fields['hidden_field'].initial = instance.id

答案 1 :(得分:1)

只需传递initial形式的对象ID:

def SchoolEditor(request,school_id):
    initial = {}
    school = School.objects.get(pk=school_id,user=request.user)
    if school:
        initial.update({'hidden_field': school.id})
    form = SchoolDescriptionForm(instance=school, initial=initial) # I want to populate the object ID 

    return render(request,'schooleditor.html',{'school':school,'form':form})