2013-12-10 98 views
1

这实际上是我正在处理的一个类的任务。我为django中的文档上传和注册创建了模型,视图和表单类。我一直在咨询不同的教程并尝试不同的技术,这就是为什么我的代码中可能有不同的方法。原谅我的新手提醒。Django文档上传表单在浏览器中不显示

  1. 第一个问题:注册表单不提交给表(Users)。我从管理端添加了用户,并且完全登录。

Model.py

class Users(models.Model): 
    id = models.AutoField(primary_key=True, unique=True) 
    title = models.CharField(max_length='10') 
    surname = models.CharField(max_length='50') 
    firstname = models.CharField(max_length='50') 
    username = models.CharField(max_length='50') 
    password = models.CharField(max_length='50') 
    email = models.EmailField(max_length='50') 
    phone = models.BigIntegerField(max_length='12') 
    city = models.CharField(max_length='50') 
    country = models.CharField(max_length='50') 
    usertype = models.CharField(max_length=13) 

Form.py

class RegisterForm(forms.Form): 
     #define fields for form 
     title = forms.CharField(max_length='10') 
     surname = forms.CharField(max_length='10') 
     firstname = forms.CharField(max_length='10') 
     username = forms.CharField(max_length='50') 
     password = forms.PasswordInput() 
     email = forms.EmailField(required=True) 
     phone = forms.CharField(max_length='15') 
     city = forms.CharField(max_length='50') 
     country = forms.CharField(max_length='20') 
     userlevel = (
      (u'Client', 'Client'), 
      (u'Proof Reader', 'Proof Reader'), 
      (u'Admin', 'Admin'), 
     ) 
     usertype = forms.ModelChoiceField(widget=forms.Select, queryset=userlevel) 

     class Meta: 
      model = Users 
      fields = ('username', 'email', 'password', 'password2') 

    def save(self, commit=True): 
      Users = super(RegisterForm, self).save(commit=False) 
      Users.title = self.cleaned_data['title'] 
      Users.surname = self.cleaned_data['surname'] 
      Users.firstname = self.cleaned_data['firstname'] 
      Users.username = self.cleaned_data['username'] 
      Users.password = self.cleaned_data['password'] 
      Users.email = self.cleaned_data['email'] 
      Users.phone = self.cleaned_data['phone'] 
      Users.city = self.cleaned_data['city'] 
      Users.country = self.cleaned_data['country'] 
      Users.usertype = self.cleaned_data['usertype'] 
      if commit: 
       Users.save() 
       return Users 

    def clean_username(self): 
        username = self.cleaned_data['username'] 
        try: 
          User.objects.get(username=username) 
        except User.DoesNotExist: 
          return username 
        raise forms.ValidationError("That username is already taken, please select another.") 

View.py

def register(request): 
    #model = Users 
    #check the request object if there is a method post for a form action 
    if request.method == 'POST': 
     #handle the form if method is found to be post 
     #create a form object 
     form = RegisterForm(request.POST) 
     context = {'form': RegisterForm} 
     #check if form is valid 
     if form.is_valid(): 
      #save form 
      Users.title = form.cleaned_data['title'] 
      Users.surname = form.cleaned_data['surname'] 
      Users.firstname = form.cleaned_data['firstname'] 
      Users.username = form.cleaned_data['username'] 
      Users.password = form.cleaned_data['password'] 
      Users.email = form.cleaned_data['email'] 
      Users.phone = form.cleaned_data['phone'] 
      Users.city = form.cleaned_data['city'] 
      Users.country = form.cleaned_data['country'] 
      Users.usertype = form.cleaned_data['usertype'] 
      #redirect to success page 
      return HttpResponseRedirect('register_success') 
     else: 
      form = RegisterForm() 
      #create arguments to check against CSRF attacks 
    args = {} 
    args.update(csrf(request)) 
    args['form'] = RegisterForm() 
    return render_to_response('register.html', args) 

def auth_view(request): 
    username = request.POST.get('username', '') 
    password = request.POST.get('password', '') 
    user = auth.authenticate(username=username, password=password) 

    if user is not None: 
     auth.login(request, user) 
     return HttpResponseRedirect('welcome') 
    else: 
     return HttpResponseRedirect('invalid') 
     #return render_to_response('auth_view.html') 

模板文件 - register.html

{% extends "main.html" %} 
{% block title %}Register{% endblock %} 
{% block content %} 
    <h2>Register</h2> 

    <form action="" method="post"> {% csrf_token %} 
    <table> {{ form }} </table> 
    <input type="submit" value="Register"> 
    </form> 

{% endblock %} 
  1. 表格文件的上传也没有显示。我不知道为什么会发生这种情况。

Models.py

class document(models.Model): 
    id = models.AutoField(primary_key=True, unique=True) 
    file = models.FileField(upload_to=get_upload_file_name) 
    statusid = models.ForeignKey('status') 
    userID = models.ForeignKey('Users') 
    #feedback = models.TextField(blank=True) 
    time = models.DateTimeField() 
    completion_time = models.DateTimeField(blank=True) 
    choice = ((u'Audio', 'Audio'), (u'Text', 'Text')) 
    filetype = models.CharField(max_length='50') 

views.py

def uploaddocs(request): 
    if request.method == 'POST': 
     form = DocumentForm(request.POST, request.FILES) 
     context = {'form': DocumentForm} 
     if form.is_valid(): 
       form.upload() 
       return HttpResponseRedirect('upload_success') 

    args = {} 
    args.update(csrf(request)) 
    args['forms'] = DocumentForm() 
    return render_to_response('uploaddocs.html', args) 

forms.py

class DocumentForm(forms.Form): 
    #define fields for form 
    model = document 
    file = forms.FileField() 
    statusid = forms.CharField(max_length='10') 
    userID = forms.CharField(max_length='10') 
    #feedback = models.TextField(blank=True) 
    time = forms.DateTimeField() 
    completion_time = forms.DateTimeField() 
    choice = ((u'Audio', 'Audio'), (u'Text', 'Text')) 
    filetype = forms.ChoiceField(choices=choice) 

def upload(self, commit=True): 
    document = DocumentForm.save(commit=False) 
    document.statusid = self.cleaned_data['statusid'] 
    document.time = self.cleaned_data['time'] 
    document.completion_time = self.cleaned_data['completion_time'] 
    document.filetype = self.cleaned_data['filetype'] 
    if commit: 
     document.upload() 
     return document 

我知道这似乎是整个任务,但相信我,这只是我未来许多错误的开始。感谢您的回复。

回答

0

有多种问题,在这里工作:

  1. 正如马丁奥格登说,你应该,如果你想直接保存到数据库中使用ModelForm。这样,你可以摆脱你的RegisterForm.save()方法和你视图中的明确任务(title = form.cleaned_data['title']等)。

  2. 在您看来,Users.title = form.cleaned_data['title']按预期不工作:您要指派给你的Users类,而不是一个具体的实例。随着ModelForm,您将不再需要这些了明确的分配,而是以供参考,这里是你如何能与常规Form这样写:

    if form.is_valid(): 
        u = Users() # create a Users instance 
        u.title = form.cleaned_data['title'] # assign the title attribute 
        # ... 
        u.save() # save this Users instance 
    
  3. 你总是需要实例通过表单模板,而不是班级。因此,而不是context = {'form': RegisterForm}你会写

    form = RegisterForm() 
    if request.method == "POST": 
        form = RegisterForm(request.POST) 
        # ... 
    context={'form': form} 
    

    一个非常有用的模式如下:

    def some_view(request): 
        form = RegisterModelForm(request.POST or None) 
        if form.is_valid() 
         form.save() 
         return redirect(...) 
        context = {'form': form} 
        return render_to_response('register.html', context) 
    

    这样,你只需要一次创建表单实例。

  4. 。在你的Users型号的错误:你是手动验证两个Users情况下不能有相同的用户名,但是想象一下两个用户注册在确切同时使用相同的名称:存在两个用户都会检查clean_username,并创建两个实例。最好为unique=True设置需要唯一的字段,因为数据库可以为你保证这些东西(而且你不需要编写那个自定义的vali)

0

看起来您期待RegisterForm的行为类似于ModelForm实例。如果更改RegisterFormdjango.forms.ModelForm而不是django.forms.Form继承并添加独特= true添加到用户名字段的Users模型,你最终会与此:

class RegisterForm(forms.ModelForm): 
    class Meta: 
     model = User 

关于文件的形式:它似乎被命名不一致:在视图中它被命名为forms,并且在模板中它被命名为form

希望有帮助!

+0

谢谢兄弟...文档上传页面现在显示...但我仍然有问题与注册表单提交到'用户'表。感谢您的帮助...赞赏它 – thurpe

相关问题