Django,Python - 如何创建一个用户只能选择 10000 到 100000 之间数字的字段?
Django, Python - How do I create a field where the user can only choose a number between 10000 and 100000?
我正在编写一个用户可以在浏览器中填写的表单。其中一个问题涉及在 10000 到 100000 之间选择一个数字。我将如何提示用户这样做?如果他们不这样做,我希望弹出一条消息,以便让他们实际选择一个介于 10000 和 100000 之间的数字。处理这个特定数字的变量称为 borrowing。表单上的数据目前保存在一个sqlite3 table中。
这是我的 models.py:
from django.db import models
from django.core.validators import MinValueValidator
from django.core.validators import MaxValueValidator
class User(models.Model):
#to store user data
firstname = models.CharField(max_length=100)
surname = models.CharField(max_length=100)
email = models.CharField(max_length=100)
telephone_number = models.CharField(max_length=15)
company_name = models.CharField(max_length=100)
company_street_address = models.CharField(max_length=100)
city = models.CharField(max_length=100)
postcode = models.CharField(max_length=10)
company_number = models.CharField(max_length=9)
filter_choices = (
('retail', 'Retail'),
('professional services', 'Professional Services'),
('food & drink', 'Food & Drink'),
('entertainment', 'Entertainment'),
)
business_sector = models.CharField(max_length=100, choices=filter_choices)
days = models.CharField(max_length=5)
reason_for_loan = models.CharField(max_length=2000)
#borrowing = models.IntegerField(choices=[(i, i) for i in range(1, 1)], blank=True)
#borrowing = models.IntegerField((validators=[MaxValueValidator(100),MinValueValidator(1)])
borrowing = models.IntegerField(validators=[MinValueValidator(1),MaxValueValidator(100)])
if 10000 <= borrowing <= 100000:
#borrowing = models.CharField(max_length=100)
def __str__(self):
return self.firstname
如您所见,我已经尝试了很多借钱的方法,但都没有成功。
这是我的forms.py:
from django import forms
from django.core.validators import MinValueValidator
from django.core.validators import MaxValueValidator
class UserForm(forms.Form):
firstname = forms.CharField(max_length=100)
surname = forms.CharField(max_length=100)
email = forms.CharField(max_length=100)
telephone_number = forms.CharField(max_length=15)
company_name = forms.CharField(max_length=100)
company_street_address = forms.CharField(max_length=100)
city = forms.CharField(max_length=100)
postcode = forms.CharField(max_length=10)
company_number = forms.CharField(max_length=9)
filter_choices = (
('retail', 'Retail'),
('professional services', 'Professional Services'),
('food & drink', 'Food & Drink'),
('entertainment', 'Entertainment'),
)
business_sector = forms.ChoiceField(choices = filter_choices)
days = forms.CharField(max_length=5)
reason_for_loan = forms.CharField(max_length=2000,widget=forms.Textarea)
borrowing = forms.IntegerField(validators=[MinValueValidator(10000),MaxValueValidator(100000)])
## business_sector = forms.CharField(
## ('retail', 'retail'),
## ('professional_services', 'professional_services'),
## ('food_&_drink', 'food_&_drink'),
## ('entertainment', 'entertainment'))
这是我的views.py:
from django.shortcuts import render
from users.forms import UserForm
from users.models import User
# the function executes with the signup url to take the inputs
def signup(request):
if request.method == 'POST': # if the form has been filled
form = UserForm(request.POST)
if form.is_valid():
# creating user data
user_obj = form.save()
return render(request, 'users/signup.html', {'user_obj': user_obj,'is_registered':True }) # Redirect after POST
firstname = request.POST.get('firstname', '')
surname = request.POST.get('surname', '')
email = request.POST.get('email', '')
telephone_number = request.POST.get('telephone_number', '')
company_name = request.POST.get('company_name', '')
company_street_address = request.POST.get('company_street_address', '')
city = request.POST.get('city', '')
postcode = request.POST.get('postcode', '')
company_number = request.POST.get('company_number', '')
form = request.POST.get('form', '')
business_sector = request.POST.get('business_sector', '')
borrowing = request.POST.get('borrowing', '')
days = request.POST.get('days', '')
reason_for_loan = request.POST.get('reason_for_loan', '')
user_obj = User(firstname=firstname, surname=surname, email=email,
telephone_number=telephone_number,company_name=company_name,
company_street_address=company_street_address,city=city,
postcode=postcode,company_number=company_number,
business_sector=business_sector,borrowing=borrowing,
days=days,reason_for_loan=reason_for_loan)
# saving all the data in the current object into the database
else:
form = UserForm() # an unboundform
return render(request, 'users/signup.html', {'form': form})
#the function executes with the showdata url to display the list of registered users
def showdata(request):
all_users = User.objects.all()
return render(request, 'users/showdata.html', {'all_users': all_users, })
这是我的html:
<!-- The alert box to be shown when the submit button is clicked-->
{% if is_registered %}
<script>alert("You are successfully registered with your new business with:{{user_obj.company_name }} and Email: {{ user_obj.email }}")</script>
{% else %}
<form action="{% url 'users:signup' %}" method="post">
{% csrf_token %}
{{ form }}
<br />
<br />
<input type="submit" value="Submit">
</form>
{% endif %}
<br />
您可以将这种验证码放入表单中。 Read the docs for more info.
例如:
class UserForm(forms.Form):
...
def clean_borrowing(self):
borrowing = self.cleaned_data['borrowing']
if not 10000 < borrowing < 100000:
raise forms.ValidationError("Please enter a borrowing value between " \
"10000 and 100000")
return borrowing
首先你根本不是DRY!
您应该使用 Django 的 ModelForm,它会让您的生活更轻松!
因此,您应该保持模型不变(您也可以删除 validators
参数)并将 forms.py
更改为:
# forms.py
from .models import User
class UserForm(forms.ModelForm):
class Meta:
model = User
fields = '__all__'
def clean_borrowing(self):
borrowing = self.cleaned_data['borrowing']
if not 10000 < borrowing < 100000:
raise forms.ValidationError("Your error message here")
return borrowing
最后在你的 views.py
中节省一些时间并写下:
# views.py
def signup(request):
# GET request. Create an unbound form
form = UserForm()
if request.method == 'POST': # if the form has been filled
form = UserForm(request.POST)
if form.is_valid():
# Form is valid. Because the Form (ModelForm) is bound to the User model, then it will create, save in db and return the instance automatically.
user_obj = form.save()
return render(request, 'users/signup.html', {'user_obj': user_obj,'is_registered':True }) # Redirect after POST
return render(request, 'users/signup.html', {'form': form})
我正在编写一个用户可以在浏览器中填写的表单。其中一个问题涉及在 10000 到 100000 之间选择一个数字。我将如何提示用户这样做?如果他们不这样做,我希望弹出一条消息,以便让他们实际选择一个介于 10000 和 100000 之间的数字。处理这个特定数字的变量称为 borrowing。表单上的数据目前保存在一个sqlite3 table中。
这是我的 models.py:
from django.db import models
from django.core.validators import MinValueValidator
from django.core.validators import MaxValueValidator
class User(models.Model):
#to store user data
firstname = models.CharField(max_length=100)
surname = models.CharField(max_length=100)
email = models.CharField(max_length=100)
telephone_number = models.CharField(max_length=15)
company_name = models.CharField(max_length=100)
company_street_address = models.CharField(max_length=100)
city = models.CharField(max_length=100)
postcode = models.CharField(max_length=10)
company_number = models.CharField(max_length=9)
filter_choices = (
('retail', 'Retail'),
('professional services', 'Professional Services'),
('food & drink', 'Food & Drink'),
('entertainment', 'Entertainment'),
)
business_sector = models.CharField(max_length=100, choices=filter_choices)
days = models.CharField(max_length=5)
reason_for_loan = models.CharField(max_length=2000)
#borrowing = models.IntegerField(choices=[(i, i) for i in range(1, 1)], blank=True)
#borrowing = models.IntegerField((validators=[MaxValueValidator(100),MinValueValidator(1)])
borrowing = models.IntegerField(validators=[MinValueValidator(1),MaxValueValidator(100)])
if 10000 <= borrowing <= 100000:
#borrowing = models.CharField(max_length=100)
def __str__(self):
return self.firstname
如您所见,我已经尝试了很多借钱的方法,但都没有成功。
这是我的forms.py:
from django import forms
from django.core.validators import MinValueValidator
from django.core.validators import MaxValueValidator
class UserForm(forms.Form):
firstname = forms.CharField(max_length=100)
surname = forms.CharField(max_length=100)
email = forms.CharField(max_length=100)
telephone_number = forms.CharField(max_length=15)
company_name = forms.CharField(max_length=100)
company_street_address = forms.CharField(max_length=100)
city = forms.CharField(max_length=100)
postcode = forms.CharField(max_length=10)
company_number = forms.CharField(max_length=9)
filter_choices = (
('retail', 'Retail'),
('professional services', 'Professional Services'),
('food & drink', 'Food & Drink'),
('entertainment', 'Entertainment'),
)
business_sector = forms.ChoiceField(choices = filter_choices)
days = forms.CharField(max_length=5)
reason_for_loan = forms.CharField(max_length=2000,widget=forms.Textarea)
borrowing = forms.IntegerField(validators=[MinValueValidator(10000),MaxValueValidator(100000)])
## business_sector = forms.CharField(
## ('retail', 'retail'),
## ('professional_services', 'professional_services'),
## ('food_&_drink', 'food_&_drink'),
## ('entertainment', 'entertainment'))
这是我的views.py:
from django.shortcuts import render
from users.forms import UserForm
from users.models import User
# the function executes with the signup url to take the inputs
def signup(request):
if request.method == 'POST': # if the form has been filled
form = UserForm(request.POST)
if form.is_valid():
# creating user data
user_obj = form.save()
return render(request, 'users/signup.html', {'user_obj': user_obj,'is_registered':True }) # Redirect after POST
firstname = request.POST.get('firstname', '')
surname = request.POST.get('surname', '')
email = request.POST.get('email', '')
telephone_number = request.POST.get('telephone_number', '')
company_name = request.POST.get('company_name', '')
company_street_address = request.POST.get('company_street_address', '')
city = request.POST.get('city', '')
postcode = request.POST.get('postcode', '')
company_number = request.POST.get('company_number', '')
form = request.POST.get('form', '')
business_sector = request.POST.get('business_sector', '')
borrowing = request.POST.get('borrowing', '')
days = request.POST.get('days', '')
reason_for_loan = request.POST.get('reason_for_loan', '')
user_obj = User(firstname=firstname, surname=surname, email=email,
telephone_number=telephone_number,company_name=company_name,
company_street_address=company_street_address,city=city,
postcode=postcode,company_number=company_number,
business_sector=business_sector,borrowing=borrowing,
days=days,reason_for_loan=reason_for_loan)
# saving all the data in the current object into the database
else:
form = UserForm() # an unboundform
return render(request, 'users/signup.html', {'form': form})
#the function executes with the showdata url to display the list of registered users
def showdata(request):
all_users = User.objects.all()
return render(request, 'users/showdata.html', {'all_users': all_users, })
这是我的html:
<!-- The alert box to be shown when the submit button is clicked-->
{% if is_registered %}
<script>alert("You are successfully registered with your new business with:{{user_obj.company_name }} and Email: {{ user_obj.email }}")</script>
{% else %}
<form action="{% url 'users:signup' %}" method="post">
{% csrf_token %}
{{ form }}
<br />
<br />
<input type="submit" value="Submit">
</form>
{% endif %}
<br />
您可以将这种验证码放入表单中。 Read the docs for more info.
例如:
class UserForm(forms.Form):
...
def clean_borrowing(self):
borrowing = self.cleaned_data['borrowing']
if not 10000 < borrowing < 100000:
raise forms.ValidationError("Please enter a borrowing value between " \
"10000 and 100000")
return borrowing
首先你根本不是DRY!
您应该使用 Django 的 ModelForm,它会让您的生活更轻松!
因此,您应该保持模型不变(您也可以删除 validators
参数)并将 forms.py
更改为:
# forms.py
from .models import User
class UserForm(forms.ModelForm):
class Meta:
model = User
fields = '__all__'
def clean_borrowing(self):
borrowing = self.cleaned_data['borrowing']
if not 10000 < borrowing < 100000:
raise forms.ValidationError("Your error message here")
return borrowing
最后在你的 views.py
中节省一些时间并写下:
# views.py
def signup(request):
# GET request. Create an unbound form
form = UserForm()
if request.method == 'POST': # if the form has been filled
form = UserForm(request.POST)
if form.is_valid():
# Form is valid. Because the Form (ModelForm) is bound to the User model, then it will create, save in db and return the instance automatically.
user_obj = form.save()
return render(request, 'users/signup.html', {'user_obj': user_obj,'is_registered':True }) # Redirect after POST
return render(request, 'users/signup.html', {'form': form})