2017-06-30 59 views
2

models.py认证的用户的字段是固定形式视图隐藏在Django

from django.db import models 
from django.contrib.auth.models import User 

class Question(models.Model): 
    asker = models.ForeignKey(User, related_name='questions') 
    question_text = models.CharField(max_length=200) 
    pub_date = models.DateTimeField(auto_now_add=True) 
    slug = models.SlugField(max_length=250, unique_for_date='publish') 


class Choice(models.Model): 
    question = models.ForeignKey(Question, on_delete=models.CASCADE) 
    choice_text = models.CharField(max_length=200) 
    votes = models.IntegerField(default=0) 

forms.py

from django.forms import ModelForm 
from .models import Question,Choice 
from betterforms.multiform import MultiModelForm 


class ChoiceForm(ModelForm): 

    class Meta: 
     model = Choice 
     exclude = ('question','votes','pub_date','slug') 

class QuestionForm(ModelForm): 

    class Meta: 
     model = Question 
     exclude = ('asker','pub_date',) 

class PollForm(MultiModelForm): 
    form_classes = { 
     'question':QuestionForm, 
     'choice':ChoiceForm, 
    } 

views.py

class PollPost(CreateView): 
    form_class = PollForm 
    template_name = "blog/post.html" 


    def form_valid(self, form): 
     question = form['question'].save(commit=False) 
     question.asker = User.objects.get(username=request.user.username) 
     question.save() 
     choice = form['choice'].save(commit=False) 
     choice.question = question 
     choice.save() 
     return HttpResponse("congrat") 

博客/ post.html

<div class="container"> 
    <div class="jumbotron"> 

    <form method="POST"> 
     <div class="text-left">{% csrf_token %} {{ form.as_p }} 
     </div> 

     <button type="submit" class="btn btn-primary btn-outline">submit</button> 
    </form> 
    </div> 

</div> 

我用另一种观点认为,以发现问题,我认为Django的认为这是无效的形式 views.py

def poster(request): 
    if request.method =='POST': 
     form = PollForm(request.POST) 
     print(1) 
     if form.is_valid(): 
      question = form['question'].save(commit=False) 
      question.asker = request.user 
      question.save() 
      choice = form['choice'].save(commit=False) 
      choice.question = question 
      choice.save() 
      return HttpResponse("congrat") 

     else : 
      print("unvalid") 
      return render(request, 'blog/post.html', 
          {'form': form}) 
    else: 
     form = PollForm() 

     args = {'form': form} 
     return render(request, 'blog/post.html', args) 

使用该视图打印1然后打印unvalid代替2

现在该视图不工作,因为我希望它提供了提问者字段并让用户从用户列表中进行选择,并且不会隐藏它,并且在提交表单后数据库中没有任何更改,页面也不会重定向也。

我应该如何编辑视图做出的选择的最高金额是三 并进行身份验证的用户是 由于事先

+0

Django没有错误? – Andreas

+0

@Andreas完全没有错误 –

+0

你可以显示模板吗? – zaidfazil

回答

2

我应该如何编辑视图以使最大的选择量为三,并使得经过身份验证的用户成为问题的提问者。

你可以使用Django inline formsets。内联表单集是模型表单集上的一个小抽象层。这些简化了通过外键处理相关对象的情况。

然后,你forms.py会,

from django.forms import inlineformset_factory 

class ChoiceForm(ModelForm): 

    class Meta: 
     model = Choice 
     exclude = ('question','votes') 

class QuestionForm(ModelForm): 

    class Meta: 
     model = Question 
     exclude = ('asker','pub_date', 'slug') 


QuestionFormset = inlineformset_factory(Question, 
             Choice, 
             fields=('choice_text',), 
             extra=3,#put number of choices here. 
             ) 

你views.py,

from django.contrib.auth.mixins import LoginRequiredMixin 

class PollPost(LoginRequiredMixin, CreateView): 
    model = Question 
    form_class = QuestionForm 
    template_name = "blog/post.html" 

    def get_context_data(self, **kwargs): 
     context = super(PollPost, self).get_context_data(**kwargs) 
     if self.request.POST: 
      context['formset'] = QuestionFormset(self.request.POST, self.request.FILES) 
     else: 
      context['formset'] = QuestionFormset() 
     return context 

    def form_valid(self, form): 
     context = self.get_context_data() 
     formset = context['formset'] 
     if formset.is_valid() and form.is_valid(): 
      form.instance.asker = self.request.user 
      self.object = form.save() 
      for choice_obj in formset: 
       choice = choice_obj.save(commit=False) 
       choice.question = self.object 
       choice.save() 
     return self.render_to_response(self.get_context_data(form=form, formset=formset)) 

会有在模板中的微小变化,

<div class="container"> 
    <div class="jumbotron"> 

    <form method="POST"> 
     <div class="text-left">{% csrf_token %} {{ form.as_p }} 
     {{ formset.management_form }} 
     {{ formset }} 
     </div> 

     <button type="submit" class="btn btn-primary btn-outline">submit</button> 
    </form> 
    </div> 

+0

非常感谢你的回复 IGOT这个时间errorin模板 ValidationError在/博客/职位/ ['ManagementForm数据丢失或被篡改'] 并突出显示{{formset}} –

+0

您正在使用哪个django版本? – zaidfazil

+0

(1,11,2,'final',0)@Fazil Zaid –

1

我不太明白为什么的ModelForm没有问题的提问者排除提问者字段,但是您可能要简化您的看法:

class PollPost(CreateView): 
    form_class = PollForm 
    template_name = "blog/post.html" 

    def form_valid(self, form): 
     form.instance.asker = self.request.user 
     form.save() 
     return super(PollPost, self).form_valid(form) 

您也可能希望使用LoginRequiredMixin的观点,以确保你总是有self.request.user。

+0

还是一样的结果不能修复它 –