Стили ошибок Django с помощью Twitter Bootstrap - PullRequest
0 голосов
/ 05 ноября 2018

Я пытаюсь стилизовать ошибки, используя загрузчик Twitter в моем проекте Django. Прямо сейчас у меня есть простая форма, которая запрашивает адрес электронной почты человека, заставляет его нажать кнопку, а затем отправляет его в базу данных. Он также имеет проверку проверки, чтобы увидеть, является ли электронное письмо уникальным в базе данных. Если он не уникален, возникает ошибка «Это письмо уже зарегистрировано». Тем не менее, когда возникает ошибка, для дублированного электронного письма рядом с полем ввода с текстом This email is already registered выводится ужасный список маркеров. Я пытаюсь оформить его так, чтобы в нем отображалось небольшое диалоговое окно под текстом ввода с желтым значком i, как это происходит, когда на входе нет знака @, то есть это не электронная почта. Некрасивая точка также появляется, когда действительный домен не включен в электронное письмо, например, .com не добавлено.

Я думаю, что проблема заключается в том, как настроен мой html формы или как представление обрабатывает ошибки формы. Возможно, поскольку поле формы имеет вид EmailField, индикатор is_valid не проверяется и, следовательно, отображает предупреждение о загрузке в Twitter.

Как мне заставить его показывать предупреждение каждый раз? Ниже мой код:

является частью index.html

        <form class="form-inline" method="post">
          <div class="input-group input-group-newsletter">
            <div class="form-group">
              {% csrf_token %}
              {{ form }}
            </div>
            <div class="form-group">
              <div class="input-group-append">
                <button class="btn btn-secondary" type="submit">Button Text</button>
              </div>
            </div>
          </div>
        </form>

views.py

from django.shortcuts import render, HttpResponse
from django.views.generic import TemplateView

from appname.forms import AppForm


class AppView(TemplateView):
    template_name = 'apps/index.html'

    def get(self, request):
        form = AppForm()
        return render(request, self.template_name, {'form': form})

    def post(self, request):
        form = AppForm(request.POST)
        if form.is_valid():
            email = form.cleaned_data['email']
            form.save()
            form = AppForm()
            args = {'form': form, 'email': email, 'signedup': True}
        else:
            args = {'form': form, 'signedup': False}
        return render(request, self.template_name, args)

forms.py

from django import forms
from .models import AppModel


class AppForm(forms.ModelForm):
    email = forms.EmailField(required=True,
                             label='',
                             widget=forms.EmailInput(attrs={'class': 'form-control',
                                                                           'placeholder': 'Enter email...',
                                                                           'name': 'email',
                                                                           'aria-label': 'Enter email...',
                                                                           'aria-describedby': 'basic-addon'}))

    class Meta:
        model = AppModel
        fields = ('email',)

    def clean_email(self, *args, **kwargs):
        email = self.cleaned_data.get("email")
        if AppModel.objects.filter(email__iexact=email).exists():
            raise forms.ValidationError("This email is already registered.")
        return email

1 Ответ

0 голосов
/ 05 ноября 2018

Возможно, вы захотите попробовать фреймворк для сообщений Django. Этот сайт показывает, как это делается. Я попробовал это сам и работает нормально, хотя я не пробовал вставлять в него иконки.

https://simpleisbetterthancomplex.com/tips/2016/09/06/django-tip-14-messages-framework.html

Обновление на основе комментария ниже:

Вот фрагменты моего проекта

in settings.py

from django.contrib.messages import constants as messages
...
MESSAGE_TAGS = {
    messages.DEBUG: 'alert-info',
    messages.INFO: 'alert-info',
    messages.SUCCESS: 'alert-success',
    messages.WARNING: 'alert-warning',
    messages.ERROR: 'alert-danger',
}

messages.html шаблон, который может быть включен в любой шаблон, где вы хотите получать уведомления

{% if messages %}
    {% for message in messages %}
        <div class="alert {{ message.tags }} alert-dismissible " role="alert">
            <button type="button" class="close" data-dismiss="alert" aria-label="Close">
                <span aria-hidden="true">&times;</span>
            </button>
            {{ message }}
        </div>
    {% endfor %}
{% endif %}

log-in.html template

<body>
{% include 'trip_monitor/messages.html' %}
<div class="login-form">
    <form method="post">
        {% csrf_token %}
        <h2 class="text-center">Materials Management</h2>
        <p align="center">Please <strong>log in</strong> to continue.</p>

        <div class="form-group">
            <input name="username" type="text" class="form-control" placeholder="Username" required="required" autofocus>
        </div>
        <div class="form-group">
            <input  name="password" type="password" class="form-control" placeholder="Password" required="required" id="password">
        </div>
        <div class="form-group">
            <button type="submit" class="btn btn-primary btn-block">Log in</button>
        </div>
    </form>
</div>
</body>

views.py

from django.contrib import messages

def login(request):
    if request.method == 'POST':
        _username = request.POST['username']
        _password = request.POST['password']
        user = authenticate(request, username=_username, password=_password)
        if user is not None:
            auth_login(request, user)
            return redirect('/trip/')
        else:
            messages.error(request, 'Username or Password is incorrect!')  # this will be shown as pop-up message
            return render(request, 'trip_monitor/login.html')
    elif request.method == 'GET':
        if request.user.is_authenticated:
            return redirect('/trip/')
        else:
            return render(request, 'trip_monitor/login.html')
...