如何在不使用自动模型表单的情况下从 Django 的文本框中获取数据?

Posted

技术标签:

【中文标题】如何在不使用自动模型表单的情况下从 Django 的文本框中获取数据?【英文标题】:How to take data from textboxes in Django without using the automated model forms? 【发布时间】:2013-02-25 18:16:36 【问题描述】:

我想做一件非常简单的事情,但由于某种原因我还没有找到解决方案。 我有一个 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>

我想要的是在填写此表单并提交它以获取所有文本框值并将其放入我的数据库中。

db模型是这样实现的:

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 从模型生成表单的自动化方式。

【问题讨论】:

您在表单中输入的密码在哪里? 对不起,我输入了全名和用户名,而不是用户名和密码。现在好了 【参考方案1】:

这是我的 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 %

现在你可以看到我的 RegisterFrom:

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 中使用自定义文本框

【讨论】:

【参考方案2】:

这不应该 用户名 = 用户名。 密码 = 用户密码

成为

User.username = 用户名 User.password = 密码

【讨论】:

【参考方案3】:

您忘记在表单中定义名称。这对于获取 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)

【讨论】:

所以 POST 方法根据文本框的名称获取文本框的值,对吧?我以为我来自ID。 request.POST.get('textboxName') 是获取此值的正确方法吗?虽然看起来是正确的,但它仍然不起作用:/ 它没有显示错误。它转到 home.html 页面,但数据未存储在 db 中:/ 这是您注册的正确路径吗:
?
我更新了返回渲染,它必须在 if 语句之后抱歉。之后告诉我错误是什么,不要忘记在模板中打印错误

以上是关于如何在不使用自动模型表单的情况下从 Django 的文本框中获取数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用表单的情况下从 Rails 应用程序发布到外部 url

如何在不使用表单的情况下从 jsp 调用 servlet

如何在不使用 Django 模型的情况下使用 MySQL 中的完整数据库

如何在不提交 HTML 表单的情况下从数据库中获取数据? [复制]

如何在不使用 foreach 循环的情况下从视图访问模型

如何在不保留唯一数字输入功能的情况下从 Django integerField 中删除箭头?