使用cookiecutter-django模板在allauth中创建多个注册表单

时间:2016-05-13 19:32:58

标签: django django-allauth cookiecutter-django

我是django的新手,在一个需要多种注册类型的网站上工作,需要两种单独的形式,并且基于使用allauth的cookiecutter-django模板。

我仍然希望保留allauth的电子邮件确认和密码验证。

我已经四处寻找解决方案了,接下来是这样的: Multiple signup, registration forms using django-allauth

它没有解决我的问题。在我的情况下,注册表单保持不变。也许只是因为我试图在表格中使用模型?

这是我尝试自定义登录表单:

在cookiecutter的app users /

在models.py中:

class Proveedor(models.Model):
    TIENE_EMPRESA = (
        ('S','Si'),
        ('M','No'),
    )
    SEXO = (
        ('F','Femenina'),
        ('M','Masculino'),
    )
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    oficios = []
    ubicacion = models.CharField(_('Ubicacion'),max_length=255)
    ubicaciones_servicios = []
    tiene_empresa = models.CharField(_('Tienes Empresa?'),max_length=1, choices=TIENE_EMPRESA)
    foto = models.ImageField(_('Foto'),upload_to=None, blank=False)
    email = models.EmailField(_('Email'),max_length=254)
    fecha_nacimiento = models.DateField(_('Fecha de nacimiento'), default=datetime.datetime.now(), blank=True)
    sexo = models.CharField(_('Sexo'),max_length=1, choices=SEXO)
    telefono = models.CharField(_('Numero de Telefono'),max_length=10)

    fotos_trabajos_realizados = []
    descripcion_forma_trabajar = models.TextField(_('Descripcion de Forma de Trabajar'),null=True, blank=True)

    class Meta:
        db_table = 'proveedor'
        permissions = (
            ("menu_proveedor", "Puede ver menu de proveedor"),
    )

在formularios.py(表格)中:

class FormularioProveedor(SignupForm):
    class Meta:
        model = Proveedor
        fields = '__all__'

def save(self, request, user):
    user = super(FormularioProveedor, self).save(request)
    user.sexo = self.cleaned_data['sexo']
    user.tiene_empresa = self.cleaned_data['tiene_empresa']
    user.save()

在views.py中:

class ProveedorRegistroView(SignupView):
    template_name = 'account/form_proveedor.html'
    form_class = FormularioProveedor
    redirect_field_name = 'proximo'
    view_name = 'registroproveedor'
    success_url = None

def get_context_data(self, **kwargs):
    ret = super(ProveedorRegistroView, self).get_context_data(**kwargs)
    ret.update(self.kwargs)
    return ret

registroproveedor = ProveedorRegistroView.as_view()
用于测试的包目录中的

urls.py:

url(r'registroproveedor', registroproveedor, name='registroproveedor')

最后模板本身:

{% extends "account/base.html" %}

{% load i18n %}
{% load crispy_forms_tags %}

{% block title %}{% trans "Registro de Proveedor" %}{% endblock title %}

{% block content %}
<form id="signup_form" method="post" action="{% url 'registroproveedor'  %}">
  {% csrf_token %}
  {{ form|crispy }}
</form>
{% endblock %}

我只是通过在设置中指向我的表单来显示新字段,分配ACCOUNT_SIGNUP_FORM_CLASS ......但这并不是我真正需要或想要的。我只想要多个注册表单,仍然能够利用allauth提供的功能和cookiecutter-django提供的模板。现在,基于这个模板,我发现很多东西可能是错误的,任何帮助都会受到赞赏。感谢。

1 个答案:

答案 0 :(得分:1)

当我进一步了解 Django 的默认用户注册表时,我发现了以下网站:

https://learndjango.com/tutorials/django-custom-user-model

本教程的一个关键方面是使用默认的 Django 类模型来创建新的类模型,如果想要添加新的元字段,这些模型会更加灵活。在 cookiecutter-django 模板中,他们在 .../users/forms.py 文件中执行以下操作:

from django.contrib.auth import forms as admin_forms

class UserCreationForm(admin_forms.UserCreationForm): 
    ...

如上所示,导入了默认的 Django 类模型,并使用它创建了一个继承默认类的所有方法和属性的类模型。如果我正确理解您的问题,您想使用 cookiecutter-django 默认模板并多次重复使用它们来创建不同类型的注册表。

我可能错了,但以下可能有效:

from (DIRECTORY, example: ...user/forms.py) import (COOKIECUTTER-DJANGO REGISTRATION CLASS, example UserCreationForm

class NewUserRegistrationForm(UserCreationForm):
    

    Class Meta(UserCreationForm.Meta):
        model = User # cookiecutter-django template already includes this
        fields = ('username', 'email', 'street', 'house_number', 'postal_code', 'province', 'state', 'country',)
        # add additional fields in here

请注意,cookiecutter-django UserCreationForm 已经是默认 Django UserCreationForm 的副本,因此我在示例中显示的代码是 cookiecutter-django UserCreationForm 的副本。因此,该示例与默认的 Django UserCreationForm 没有什么不同,除了包含的 Meta 字段变量和 allauth 的使用。

我自己还是个新手,所以我可能是错的,但这可能会解决您的问题。