python - Django 中的表单占位符无法正确显示

标签 python django forms placeholder

如标题所述,表单小部件中的占位符属性未正确显示。它是随机的,有时效果很好,有时我需要刷新浏览器才能显示。 我需要它们,因为我没有在模板中显示字段标签。 无论如何,这是代码:

#FORMS.PY
class RegistrationForm(UserCreationForm):
    first_name = forms.CharField(label=_('First name'), max_length=30)
    last_name = forms.CharField(label=_('Last name'), max_length=30)
    email = forms.EmailField(label=_("Email"), required=True)

    class Meta:
        model = User
        fields = ('username', 'first_name', 'last_name', 'email', 'password1', 'password2')

    def __init__(self, *args, **kwargs):
        super(RegistrationForm, self).__init__(*args, **kwargs)
        # Set field Label as Placeholder for every field
        for field in self.base_fields.values(): 
            field.widget.attrs["placeholder"] = field.label
        # Set HTML and CSS attributes to the fields
        self.fields['username'].widget.attrs.update({'class':TEXTINPUT_CSS})
        self.fields['email'].widget.attrs.update({'class':EMAILINPUT_CSS})
        self.fields['password1'].widget.attrs.update({'class':PASSWORDINPUT_CSS})
        ...

顺便说一句,我正在使用 Django 开发服务器,问题可能来自服务器速度慢的事实。 任何帮助将不胜感激

根据要求编辑 Views.py 和模板

#views.py
def register(request):
    if request.method == 'POST':
        form = RegistrationForm(request.POST)
        if form.is_valid():
            form.save()
            if REGISTER_EMAIL_CONFIRMATION == True:
                # Add email confirmation
                username = form.cleaned_data['username']
                email = form.cleaned_data['email']
                salt = hashlib.sha1(str(random.random()).encode('utf-8')).hexdigest()[:5]            
                activation_key = hashlib.sha1((salt+email).encode('utf-8')).hexdigest()            
                key_expires = datetime.datetime.today() + datetime.timedelta(CONFIRMATION_KEY_EXPIRE_DAYS)
                # Create and save User Profile
                user=User.objects.get(username=username)            
                new_profile = UserProfile(user=user, activation_key=activation_key, key_expires=key_expires)
            new_profile.save()
                # Send email with activation key
                subject_file = 'app_authentication/email_signup_confirm_subject.txt'
                body_file = 'app_authentication/email_signup_confirm_body.html'
                context = {'username':username, 'activation_key':activation_key}
                send_email_from_files([email], subject_file, body_file, context)
                return redirect('confirm_email_sent')
            else:
                return redirect('register_success')
    else:
        form = RegistrationForm()
    return render(request, 'registration/register.html', {'form': form, 'title': _('Register')})


#register.html
{% block content2 %}
<form id="register_form" autocomplete="off" method="post" action="{% url 'register' %}">
{% csrf_token %}
    <div class="clearfix">
    {% for field in form %}
        <div class="form-group">
            {{ field }}
            {% if form.errors %}
            {% for error in field.errors %}
                <div class="alert alert-error">
                    <strong>{{ error|escape }}</strong>
                </div>
            {% endfor %}
            {% endif %}
        </div>
    {% endfor %}
        {% if form.errors %}
        {% for error in form.non_field_errors %}
            <div class="alert alert-error">
                <strong>{{ error|escape }}</strong>
            </div>
        {% endfor %}
        {% endif %}
    </div>
    <!-- Send Button -->
    <div class="pt-10">
        <button class="submit_btn btn btn-mod btn-medium btn-round btn-full" id="reg-btn" name="submit">{{ title }}</button>
    </div>
</form>
{% endblock content2 %}

截图:

当我启动开发服务器并尝试登录时: placeholders not working

刷新浏览器后的相同登录页面: placeholders working after refresh

@akarilimano:

class LoginForm(AuthenticationForm):
    # username doesn't have label in AuthenticationForm
    username = forms.CharField(label=_("Username"), max_length=254)

    def __init__(self, *args, **kwargs):
        super(LoginForm, self).__init__(*args, **kwargs)
        # Set field Label as Placeholder for every field
        for field in self.base_fields.values():
            print(field.label)
            field.widget.attrs['placeholder'] = field.label

最佳答案

尝试在此处更改 base_fields:

    for field in self.base_fields.values(): 

字段:

    for field in self.fields.values():

base_fields 字典是为类定义的基本字段集。您可以更改它,但不建议这样做,在您的情况下也不需要。

我想如果您在更改 base_fields 后调用 super ,您的版本会工作:

def __init__(self, *args, **kwargs):
    for field in self.base_fields.values(): 
        field.widget.attrs["placeholder"] = field.label
    super(RegistrationForm, self).__init__(*args, **kwargs)

关于python - Django 中的表单占位符无法正确显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29979760/

相关文章:

python - 从 Django timesi 中删除尾随数据

django - 链接查询时 QuerySet 结果重复

python - Django 信号接收器接受 self 参数

javascript - AngularJS 表单数据未定义

python - 如何在Python中通过套接字建立连接?

Python3-ldap key 错误 : 'attributes'

python - 在 Python 中重置文本框

forms - 如何在 Elm 中提交表单?

CSS 表单对齐在 Chrome 中很好,但在 Firefox 中关闭

python - 覆盖python中的递归方法