Регистрация Django прервалась после добавления i18n

Недавно я добавил i18n и l10n в свое приложение Django, но моя регистрация сломалась. У меня есть это:

мое приложение/views.py

def register_user(request):
   if request.method == 'POST':
      form = MyRegistrationForm(request.POST)
      if form.is_valid():
         print "Is valid"
         form.save()
         return HttpResponseRedirect('/register_success/')
   args = {}
   args.update(csrf(request))
   args['form'] = MyRegistrationForm()
   print "Is invalid"
   return render_to_response('register.html', args, context_instance=RequestContext(request))

register.html

{% extends 'login_base.html' %}

{% block content %}

 <div class="col-sm-3 col-sm-offset-5"> 
   <h1> Join Now</h1>
     <form method='POST' action="{% url 'register' %}"> {% csrf_token %}
        {% if form.errors %}
          <p style="color: red;">
             Please correct the error{{ form.errors|pluralize }} below.
           </p>
       {% endif %}

    <table>
         {{ form.as_p }}
    </table>
        <input type='Submit' class='btn btn-primary btn-block'>
     </form>
 </div> 


{% endblock %}     

urls.py

# -*- coding: utf-8 -*-
from django.conf.urls import include, url, patterns
from django.contrib import admin
from django.conf import settings
from django.conf.urls.i18n import i18n_patterns


urlpatterns = i18n_patterns('',
    url(r'^$', 'myApp.views.home', name='home'),
    url(r'^admin/', include(admin.site.urls)),
    url(r'^auth/$', 'myApp.views.auth_view', name='auth'),
    url(r'^register/', 'myApp.views.register_user', name='register'),
    url(r'^register_success/', 'myApp.views.register_success', name='register_success'),   
)

Моя форма

Я добавил несколько операторов отладки в свой views, которые предполагают, что форма недействительна, но это работало до того, как я изменил, чтобы добавить поддержку i18n. Кто-нибудь сталкивался с этим раньше?

Некоторые из изменений, которые я пытался внести, — это изменение всех HttpResponseRedirect('/foo/') на HttpResponseRedirect(reverse('foo')) и изменение действий формы с action='/register/' на action="{% url 'register' %}".

Любая помощь будет здорово. Пожалуйста, дайте мне знать, если я упустил какие-либо важные детали.

Я использую Джанго 1.7.4.

Спасибо, ерип

ИЗМЕНИТЬ

В моей регистрационной форме я получаю сообщение об ошибке «Introduzca una fecha válida». (Используйте действительную дату).

Мой текущий формат даты — ММ/ДД/ГГГГ, но я использую испанский язык. Что я делаю? Я уже определил формат даты в моем forms, ниже:

формы.py

class MyRegistrationForm(forms.ModelForm):
    """
    Form for registering a new account.
    """
    GENDER_CHOICES = (
        ('M', 'Male'), 
        ('F', 'Female'),
    )

    USER_TYPE = (
    ('S', 'Student'),
    ('T', 'Teacher'),
    ('B', 'Student/Teacher'),
    )

    email = forms.EmailField(widget=forms.EmailInput,label="Email")
    date_of_birth = forms.DateField(widget=forms.DateInput(format='%m/%d/%Y'), label="Date of birth (MM/DD/YYYY)")
    gender = forms.ChoiceField(widget=RadioSelect, choices=GENDER_CHOICES, label="Gender")
    user_type = forms.ChoiceField(widget=RadioSelect, choices=USER_TYPE, label="Type of user")
    password1 = forms.CharField(widget=forms.PasswordInput,
                                label="Password")
    password2 = forms.CharField(widget=forms.PasswordInput,
                                label="Password (again)")

    class Meta:
        model = MyUser
        fields = ['email', 'date_of_birth', 'gender', 'user_type', 'password1', 'password2']

    def clean(self):
        """
        Verifies that the values entered into the password fields match

        NOTE: Errors here will appear in ``non_field_errors()`` because it applies to more than one field.
        """
        cleaned_data = super(MyRegistrationForm, self).clean()
        if 'password1' in self.cleaned_data and 'password2' in self.cleaned_data:
            if self.cleaned_data['password1'] != self.cleaned_data['password2']:
                raise forms.ValidationError("Passwords don't match. Please enter both fields again.")
        return self.cleaned_data

    def save(self, commit=True):
        user = super(MyRegistrationForm, self).save(commit=False)
        user.set_password(self.cleaned_data['password1'])
    user.set_adult()
        if commit:
            user.save()
        return user

person erip    schedule 23.04.2015    source источник
comment
Можете ли вы поделиться выводом отладки, который заставляет вас полагать, что форма недействительна? Обычно я добавляю {{ form.errors }} в шаблон, чтобы посмотреть, что происходит.   -  person Dwight Gunning    schedule 23.04.2015
comment
См. редактирование. Шаблон не выдает ошибки, но я поместил оператор печати в представление.   -  person erip    schedule 23.04.2015
comment
Если форма недействительна, вы перезаписываете переменную контекста совершенно новым экземпляром формы.... поэтому вы теряете слова ошибок.   -  person Dwight Gunning    schedule 23.04.2015
comment
@dwightgunning Пожалуйста, смотрите редактирование.   -  person erip    schedule 23.04.2015
comment
Используйте инструменты разработчика браузера, чтобы убедиться, что данные POST отправляются в ожидаемом формате.   -  person Dwight Gunning    schedule 23.04.2015
comment
Кроме того... вы устанавливаете формат виджета, но он может не поддерживаться самим полем.... См.: stackoverflow .com/a/17300025/263421   -  person Dwight Gunning    schedule 23.04.2015


Ответы (1)


Чтобы дополнить мой последний комментарий некоторым кодом... хотя бы начните с этого:

def register_user(request):
   args = {}
   args.update(csrf(request))

   if request.method == 'POST':
      form = MyRegistrationForm(request.POST)
      if form.is_valid():
         print "Is valid"
         form.save()
         return HttpResponseRedirect('/register_success/')
      else:
         print "Is invalid"  
         args = {}
         args.update(csrf(request))
         args['form'] = form
   else:
       args = {}
       args.update(csrf(request))
       args['form'] = MyRegistrationForm()

   return render_to_response('register.html', args, context_instance=RequestContext(request))

Я не горжусь кодом условной иерархии/дубликата, но он должен работать.

person Dwight Gunning    schedule 23.04.2015