使用从Django视图传递的上下文变量自动填充Django模板(无js)

时间:2016-02-27 18:52:29

标签: django django-forms django-templates django-views

我有Django模板,其中有一个CharField。用户可以在此输入手机号码并提交。

连接到此模板的视图有时会传递给所述模板,这是一个包含预定义电话号码{{ number }}的上下文变量。

如何使用CharField 自动填充 Django模板中的{{ number }}

模板代码如下:

<form action="{% url 'user_phonenumber' slug=unique num=decision %}" method="POST">
{% csrf_token %}
<b style="font-size:90%;color:green;">Enter your mobile number:</b><br><br>
{{ form.mobile_number }}<br><br>
<input type="submit" name="number" value="OK"><br>
</form>

如果需要, forms.py 包含以下内容:

class UserPhoneNumberForm(forms.Form):
    mobile_number = forms.CharField(max_length=50)
    class Meta:
        fields = ("mobile_number")

views.py 中,我只想:

class UserPhoneNumberView(FormView):
    form_class = UserPhoneNumberForm
    template_name = "get_user_phonenumber.html"

    def get_context_data(self, **kwargs):
        context = super(UserPhoneNumberView, self).get_context_data(**kwargs)
        if self.request.user.is_authenticated():
            #some code to determine what number should be
            context["number"] = number
        return context

我查看了一些other SO answers。我链接的最后一个接近解决问题,但解决方案不是动态值(这是我需要的),还有模型形式的解决方案。其余的不能满足我的特殊需求。

1 个答案:

答案 0 :(得分:2)

我需要覆盖我的FormView def get_initial(self):才能实现这一目标。即而不是将上下文变量传递给模板,将变量作为initial通过get_initial()传递给相关表单。

我是这样做的:

def get_initial(self):
    """
    Returns the initial data to use for forms on this view.
    """
    if self.request.user.is_authenticated():
        #What's the latest chatpicmessage which houses a pic you own
        try:
            msg = PicMessage.objects.filter(which_pic__owner=self.request.user).latest('sending_time')
            self.initial = {'mobile_number': msg.what_number} #initial needs to be passed a dictionary
            return self.initial
        except:
            return self.initial
    else:#i.e user is not authenticated
        return self.initial
    return self.initial

有关此问题的更多文档可在此处找到:https://docs.djangoproject.com/es/1.9/ref/forms/fields/#initial