首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >身份验证表单在django中从未有效。

身份验证表单在django中从未有效。
EN

Stack Overflow用户
提问于 2022-09-13 08:30:38
回答 1查看 30关注 0票数 0

我有django应用程序,里面有身份验证。我有这样的forms.py文件:

代码语言:javascript
运行
复制
<form class="login_form" method="post" novalidate>
            {% csrf_token %}
            <div class="col-md-3 col-md-auto text-center">
                <b>First Name:<b>
                {{ form.first_name }}
                {% if 'first_name' in error %}
                  <div style='color:red'>{{error.first_name.0.message}}</div>
                {% endif %}
              </div>

              
              <div class="col-md-3 col-md-auto text-center">
                <b>Last Name:<b>
                {{ form.last_name }}
                {% if 'last_name' in error %}
                  <div style='color:red'>{{error.last_name.0.message}}</div>
                {% endif %}
              </div>

              <div class="col-md-3 col-md-auto text-center">
                <b>username:<b>
                {{ form.username }}
                {% if 'username' in error %}
                  <div style='color:red'>{{error.username.0.message}}</div>
                {% endif %}
              </div>

              <div class="col-md-3 col-md-auto text-center">
                <b>Email:<b>
                {{ form.email }}
                {% if 'email' in error %}
                  <div style='color:red'>{{error.email.0.message}}</div>
                {% endif %}
              </div>

              <div class="col-md-3 col-md-auto text-center">
                <b>Password<b>
                {{ form.password }}
                {% if 'password' in error %}
                  <div style='color:red'>{{error.password.0.message}}</div>
                {% endif %}
              </div>

              <div class="col-md-3 col-md-auto text-center">
                <b>Confirm password:<b>
                {{ form.confirm_password }}
                {% if 'confirm_password' in error %}
                  <div style='color:red'>{{error.confirm_password.0.message}}</div>
                {% endif %}
              </div>
            <button type="submit" class="submit_btn">Sign Up</button>
            <span class="peder"><p>If you already have account<br><a href="">Login</a></p></span>
          </form>

和forms.py:

代码语言:javascript
运行
复制
class CustomerSignUpForm(UserCreationForm):
    first_name = forms.CharField(required=True)
    last_name = forms.CharField(required=True)
    email = forms.EmailField(required=True)
    username = forms.CharField(max_length=40)
    password = forms.CharField(max_length=30)
    confirm_password = forms.CharField(max_length=30)


    class Meta(UserCreationForm.Meta):
        model = User
    
    @transaction.atomic
    def save(self):
        user = super().save(commit=False)
        user.is_customer = True
        user.save()
        customer = Customer.objects.create(user=user)
        customer.first_name = self.cleaned_data.get('first_name')
        customer.last_name = self.cleaned_data.get('last_name')
        customer.username = self.cleaned_data.get('username')
        customer.email = self.cleaned_data.get('email')
        customer.password = self.cleaned_data.get('password')
        customer.confirm_password = self.cleaned_data.get('confirm_password')
        customer.save()
        return user

我的模型看起来是这样的:

代码语言:javascript
运行
复制
class User(AbstractUser):
    is_customer = models.BooleanField(default=False)
    is_employee = models.BooleanField(default=False)
    # first_name = models.CharField(max_length=100)
    # last_name = models.CharField(max_length=100)

    signup_confirmation = models.BooleanField(default=False)

class Customer(models.Model):
    user = models.OneToOneField(User, on_delete = models.CASCADE, primary_key = True)
    first_name = models.CharField(max_length=100, blank=True)
    last_name = models.CharField(max_length=100, blank=True)
    username = models.CharField(max_length=40, blank=True)
    email = models.EmailField(max_length=40, blank=True)
    password = models.CharField(max_length=30, blank=True)
    confirm_password = models.CharField(max_length=30, blank=True)

因此,当用户单击注册表单上的submit按钮时,应该保存表单并向他发送电子邮件。视图

代码语言:javascript
运行
复制
class customer_register(CreateView):
    model = User
    form_class = CustomerSignUpForm
    template_name = 'authentication/customer_register.html'
    def form_valid(self, form):

        user = form.save()
        # current_site = get_current_site(request)
        current_site = '127.0.0.1:8000'
        subject = 'Please Activate Your Account'
        message = render_to_string('authentication/email/activation_request.html', {
            'user': user,
            'domain': current_site,
            'uid': urlsafe_base64_encode(force_bytes(user.pk)),
            'token': account_activation_token.make_token(user),
        })
        send_mail(
            subject,
            message,
            'from@example.com',
            ['to@example.com'],
            fail_silently=False,
        )
        return redirect('/')

,但是当我单击页面上的submit按钮时,什么都不会发生。在我的终端中,我确实得到了[13/Sep/2022 08:18:39] "POST /accounts/customer_register/ HTTP/1.1" 200 9660,但是用户没有被创建,电子邮件也没有发送。有人能解释一下为什么会发生这种情况并提出解决方案吗?谢谢:)

EN

回答 1

Stack Overflow用户

发布于 2022-09-13 10:04:08

首先。

我们需要安装很少的依赖项。

代码语言:javascript
运行
复制
1. pip install django-crispy-forms
2. add 'crispy_forms', to your INSTALLED_APPS in your projects settings.py
3. add CRISPY_TEMPLATE_PACK = 'bootstrap4' to your settings.py

身份验证/客户注册.

我们通过简洁的表单简化了表单,这给了我们一个引导4的结果。

代码语言:javascript
运行
复制
{% load crispy_forms_tags %}

<form class="login_form" method="post" novalidate>
    {% csrf_token %}
    {% crispy form %}
    <button type="submit" class="btn btn-success mt-3 float-end">Submit</button>
</form>

forms.py

我们创建一个以模型用户及其字段为Meta的modelForm:

代码语言:javascript
运行
复制
from django import forms

class CustomerSignUpForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ['first_name', 'last_name', 'email', 
                  'username', 'password', 'confirm_password']

views.py

代码语言:javascript
运行
复制
#The generic view CreateView Polymorphism already benefits of the post method that will save the user

from django.views.generic import CreateView
from.forms import CustomerSignUpForm

class CustomerRegisterCreateView(CreateView):
    model = User
    form_class = CustomerSignUpForm
    template_name = 'authentication/customer_register.html'

urls.py

我们创建一个路径,这样我们就可以将它链接到一个URL,而不会忘记.as_view(),因为它是一个基于类的视图(基于函数的视图不需要这样)

代码语言:javascript
运行
复制
 from .views import (
       CustomerRegisterCreateView,
 )


urlpatterns = [
    path('customer-register/', CustomerRegisterCreateView.as_view(), name="customer-register"),
    ]

models.py

一旦用户被创建,我们就会使用一个在创建用户时触发的信号。

代码语言:javascript
运行
复制
from django.db.models.signals import post_save

def User_receiver(sender, instance, created, *args, **kwargs):

    if created:
        print('we went thought the User signal !')
        subject = "Welcome"
        email_template_name = "authentication/Register-email.txt"
        user = User.objects.get(username=instance.username)
        c = {
            'username': user,
        }
        email = instance.email
        email_1 = render_to_string(email_template_name, c)
        send_mail(subject, email_1, 'your_email',
              [email], fail_silently=False)
 '''
 post_save.connect(User_receiver, sender=User)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73699852

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档