简体   繁体   English

为什么在保存Django表单时出现ValueError

[英]Why I am getting ValueError when saving a Django form

model.py model.py

class User(models.Model):
    ImageKitConf.CACHEFILE_DIR = 'uploads/200/'

    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=20)
    username = models.CharField(max_length=30, unique=True)
    password = models.CharField(max_length=100)
    email = models.EmailField(unique=True)
    phone = models.CharField(max_length=20)
    address = models.CharField(max_length=100)

    photo = models.ImageField(upload_to='uploads/200/', default='uploads/200/default.png', blank=True)
    thumb = ImageSpecField(
        source=photo,
        processors=[SmartResize(200,200)],
    )
    role = models.ForeignKey('Role', default=3, on_delete=models.CASCADE)
    is_active = models.BooleanField(default=True)
    activation_code = models.CharField(max_length=50)
    password_reset_code = models.CharField(max_length=50, default=0)

form.py form.py

class Registration_Form(forms.ModelForm):
    CHOICES = [('1', 'Active',), ('0', 'Inactive',)]
    is_active  = forms.ChoiceField(label='Is Active', choices=CHOICES, required=True, widget=forms.RadioSelect())
    user_title = forms.ModelChoiceField(label='User Role', empty_label='--- Select a Role ---',queryset=Role.objects.all() , widget=forms.Select(attrs={'class': 'span8'}),required=True)
    class Meta:
        model = User
        exclude = ('activation_code', 'password_reset_code', 'role')
        widgets = {
            'first_name' : forms.TextInput(attrs= {'type':'text', 'placeholder': "First Name", 'class': 'span8', 'title': 'First Name'}),
            'last_name'  : forms.TextInput(attrs= {'type':'text', 'placeholder': "Last Name", 'class': 'span8', 'title': 'Last Name'}),
            'username'   : forms.TextInput(attrs= {'type':'text', 'placeholder': "User Name", 'class': 'span8', 'title': 'User Name'}),
            'password'   : forms.TextInput(attrs= {'type':'password', 'placeholder': "Password", 'class': 'span8', 'title': 'Password'}),
            'email'      : forms.TextInput(attrs= {'type': 'text', 'placeholder': "Email Address", 'class': 'span8', 'title': 'Email'}),
            'phone'      : forms.TextInput(attrs= {'type':'text', 'placeholder': "Phone Number", 'class': 'span8', 'title': 'Start with +88', 'pattern': '^[\+][8][8]\d{11}'}),
            'address'    : forms.TextInput(attrs= {'type':'text', 'placeholder': "Address", 'class': 'span8', 'title': 'Address'}),
            'photo'      : forms.FileInput()

        }

views.py views.py

def registration(request):
    form = Registration_Form()
    if request.method == 'POST':
        form_values = Registration_Form(request.POST, request.FILES)
        if form_values.is_valid:
            form_values.save(commit=False)
            return redirect('Users:registration')

    return render(request, 'Users/form.html', {'form': form})

I getting this error 我收到此错误

Internal Server Error: /users/registration/ Traceback (most recent call last): 
File "D:\Anaconda3\lib\site-packages\django\core\handlers\exception.py", line 35, in inner
    response = get_response(request)
File "D:\Anaconda3\lib\site-packages\django\core\handlers\base.py", line 128, in _get_response
    response = self.process_exception_by_middleware(e, request)
File "D:\Anaconda3\lib\site-packages\django\core\handlers\base.py", line 126, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "G:\DJANGO PROJECTS\Login_and_Registration\Users\views.py", line 65, in registration
    form_values.save(commit=False)
File "D:\Anaconda3\lib\site-packages\django\forms\models.py", line 451, in save
    'created' if self.instance._state.adding else 'changed', ValueError: The User could not be created because the data didn't validate. [31/Mar/2018 00:40:49] "POST /users/registration/ HTTP/1.1" 500 76566

The problem is that you have form_values.is_valid instead of form_values.is_valid() . 问题是您有form_values.is_valid而不是form_values.is_valid()

The method form_values.is_valid will always evaluate to True , which means that your are trying to save the form even when it is invalid. 方法form_values.is_valid将始终求值为True ,这意味着即使表单无效,您也将尝试保存该表单。 You need to call the method with form_values.is_valid() . 您需要使用form_values.is_valid()调用该方法。

You should change it to: 您应该将其更改为:

if form_values.is_valid():
    form_values.save(commit=False)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM