为什么没有显示TimeInput的Django小部件

时间:2015-06-14 21:02:03

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

我正在尝试在表单中创建TimeInput字段,并注意到the widget isn't showing correctly。但是当我查看localhost:8000/admin时,我会看到the widget showing up correctly

我的代码如下。对于models.py

class TimeLimit(models.Model):
    before = models.TimeField(blank=True, default=time(7, 0)) # 7AM
    after = models.TimeField(blank=True, default=time(23, 0)) # 11PM

views.py

class UpdateTimeLimitView(LoginRequiredMixin, FormView):
    model = TimeLimit
    template_name = 'accounts/update_time_limit.html'
    form_class = UpdateTimeLimitForm

    def get_success_url(self):
        return reverse_lazy('accounts:user_profile') + '?username=' + self.request.GET['username']

    def get_context_data(self, **kwargs):
        data = super(UpdateTimeLimitView, self).get_context_data(**kwargs)
        data['username'] = self.request.GET['username']
        return data

forms.py

class UpdateTimeLimitForm(forms.Form):
    time_error = {'required': 'This field is required.',
                  'invalid': 'Please enter valid Hour:Minute values.'}

    before = forms.TimeField(widget=forms.TimeInput(format='%H:%M'))
    after = forms.TimeField(widget=TimeInput(format='%H:%M'))

    class Meta:
        model = TimeLimit

最后,update_time_limit.html

中字段的相关部分
<div class="container">
    <form method="post">
        {% csrf_token %}
        <p>
        {% for field in form %}
            {{ field.errors }}
            <label for="{{ field.id_for_label }}">{{ field.label }}({{ field.help_text }}):</label>
            <br />
            {{ field }}<br /><br /> and
        {% endfor %}
        </p>
        <input class="btn btn-primary done-btn" type="submit" value="Update Time Limit">
    </form>
</div>

我有什么遗漏或做错了吗?谢谢。

2 个答案:

答案 0 :(得分:3)

Django管理员使用AdminTimeWidget来显示时间字段,而不是您在代码中使用的TimeInput小部件。

没有记录的方法可以重用Django管理员之外的AdminTimeWidget。让它工作是非常hacky(请参阅this question上的答案,这可能已经过时了),所以最好使用不同的小部件。

答案 1 :(得分:0)

将 datetime.time(7, 0) 转换为适合我的字符串。

data['before'] = data['before'].strftime('%H:%M:%S')