如何在Django中不使用自动模型表单从文本框获取数据?
我有一件很简单的事情想做,但不知道为什么还没找到解决办法。
我有一个HTML表单:
<form id="user_form" method="POST" action="/ProjectName/home/">
{% csrf_token %}
<div class="registerLabel">
Full name:
</div>
<div class="registerTextLabel">
<input type="text" id="registerFullName" class="registerTextDetails">
</div>
<div class="registerLabel">
Username:
</div>
<div class="registerTextLabel">
<input type="text" id="registerUsername" class="registerTextDetails">
</div>
<div id="registerButtonDiv">
<button class="registerButtons" id="cancelRegisterButton">Cancel</button>
<button type="submit" class="registerButtons" id="submitRegistration">Register</button>
</div>
</form>
我想要的就是在填写完这个表单并提交后,把所有的文本框里的值拿出来,放到我的数据库里。
我的数据库模型是这样实现的:
class User(models.Model):
username = models.CharField(max_length=200)
password = models.CharField(max_length=200)
...
def __unicode__(self):
return self.username
这是视图的代码:
def register(request):
context = RequestContext(request)
registed = False
if request.method == 'POST':
form = User(data = request.POST)
username = request.POST.get('registerUsername')
password = request.POST.get('registerPass')
user = form.save()
username = User.username
password = User.password
u = User(username,password,...)
u.save()
registered = True
else:
form = User()
return render_to_response('ProjectName/home.html', {'user_form':User}, context)
我不想使用Django那种自动生成表单的方式,它是根据模型生成表单的。
3 个回答
0
这是我的html文件:
{% block content %}
<div class="container">
<h6 class="dress"><a href="{% url 'home' %}">Home</a> <i> </i> Register </h6>
</div>
<div class="back">
<h2>PRODUCTS</h2>
</div>
<div class="container">
<div class="register">
<h3>PERSONAL INFORMATION</h3>
<form method='POST' action=''>{% csrf_token %}
<div class="mation">
<div>
<span>User Name</span>
<input id="id_username" maxlength="150" name="username" type="text" required />
<span class="helptext">Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.</span></p>
</div>
<div>
<span>Email Address</span>
<input id="id_email" maxlength="254" name="email" type="text" />
</div>
<div>
<span>Password</span>
<input id="id_password1" name="password1" type="password" required />
</div>
<div>
<span>Confirm Password</span>
<input id="id_password2" name="password2" type="password" required />
</div>
</div>
<input type="submit" value="Register">
</form>
</div>
</div>
{% endblock %}
现在你可以看到我的注册表单:
class RegistrationForm(forms.ModelForm):
password1 = forms.CharField(label="Password", widget=forms.PasswordInput())
password2 = forms.CharField(label="Confirm Password", widget=forms.PasswordInput())
class Meta:
model = User
fields = ['username', 'email']
def clean_password2(self):
password1 = self.cleaned_data.get("password1")
password2 = self.cleaned_data.get("password2")
try:
if ((password1 and password2) and (password1 != password2)):
raise forms.ValidationError("Password Do not Match")
except:
pass
return password2
def save(self, commit=True):
user = super(RegistrationForm, self).save(commit=False)
user.set_password(self.cleaned_data['password1'])
if commit:
user.save()
return user
就这样,我在Django中使用了自定义文本框。
0
这段代码是不是应该这样写:
username = User.username
password = User.password
而不是:
User.username = username
User.password = password
1
你忘了在表单里定义名字了。这对获取POST数据很重要。
<form .........>
{{error}}<br/><br/>
<div class="registerLabel">Username:</div>
<div class="registerTextLabel">
<input type="text" id="registerUsername" name="registerUsername" class="registerTextDetails">
</div>
<div class="registerLabel" id="registerLabelPass">Password:</div>
<div class="registerTextLabel">
<input type="password" id="registerPass" name="registerPass" class="registerTextDetails">
</div>
</form>
def register(request):
context = RequestContext(request)
registered = False
error = ''
if request.method == 'POST':
username = request.POST.get('registerUsername')
password = request.POST.get('registerPass')
if username and password:
username_exist = User.objects.filter(username=username)
if username_exist:
error = username is already taken, try another
else:
User.objects.create(username=username, password=password)
registered = True
else:
error = all fields are required
return render_to_response('ProjectName/home.html', {'error':error}, context)