2014-11-04 20 views
0

views.py我想提出一個單一功能的forms.py而不是兩個在views.py

class CreateTaskView(LoginRequiredMixin, MyStaffUserRequiredMixin, generic.CreateView): 
    model = Task 
    form_class = TaskForm 
    template_name = 'tasks/form.html' 

    def get_context_data(self, *args, **kwargs): 
     ctx = super(CreateTaskView, self).get_context_data(*args, **kwargs) 
     ctx['task_form'] = ctx.get('form') 
     ctx['action'] = 'Add' 
     ctx['cancel_url'] = reverse('tasks.list') 
     return ctx 


    def form_valid(self, form): 
     task_object = form.save(self.request.user, commit=False) 
     admin_time = form.cleaned_data['admin_time'] 
     if admin_time: 
      task_object.execution_time=admin_time 
      task_object.save(self.request.user) 
     messages.success(self.request, _('Your task has been created.')) 
     return redirect('tasks.list') 

class UpdateTaskView(LoginRequiredMixin, MyStaffUserRequiredMixin, generic.UpdateView): 
    model = Task 
    form_class = TaskForm 
    template_name = 'tasks/form.html' 

    def get_context_data(self, *args, **kwargs): 
     ctx = super(UpdateTaskView, self).get_context_data(*args, **kwargs) 
     ctx['task_form'] = ctx.get('form') 
     ctx['action'] = 'Update' 
     ctx['cancel_url'] = reverse('tasks.detail', args=[self.get_object().id]) 
     return ctx 

    def form_valid(self, form): 
     admin_time = form.cleaned_data.get('admin_time') 
     if admin_time: 
      self.object.execution_time = admin_time 
      self.object.save() 
     form.save(self.request.user) 


     messages.success(self.request, _('Your task has been updated.')) 
     return redirect('tasks.list') 

我在這兩個類別中使用相同的功能:def form_valid(self,form)

是否有可能在表單中添加此驗證?

forms.py

class TaskForm(forms.ModelForm): 
    keywords = (forms.CharField(
       help_text=_('Please use commas to separate your keywords.'), 
       required=False, 
       widget=forms.TextInput(attrs={'class': 'medium-field'}))) 
    admin_time = forms.CharField(
       help_text=_('Enter If more than 60 minutes.'), 
       required=False, 
       widget=forms.TextInput(attrs={'class': 'fill-width'})) 

    def __init__(self, *args, **kwargs): 
     if kwargs['instance']: 
      initial = kwargs.get('initial', {}) 
      initial['keywords'] = kwargs['instance'].keywords_list 
      kwargs['initial'] = initial 
     super(TaskForm, self).__init__(*args, **kwargs) 

    def _process_keywords(self, creator): 
     if 'keywords' in self.changed_data: 
      kw = [k.strip() for k in self.cleaned_data['keywords'].split(',')] 
      self.instance.replace_keywords(kw, creator) 

    def clean(self): 
     cleaned_data = super(TaskForm, self).clean() 
     start_date = cleaned_data.get('start_date') 
     end_date = cleaned_data.get('end_date') 
     if start_date and end_date: 
      if start_date >= end_date: 
       raise forms.ValidationError(_("'End date' must be after 'Start date'")) 
     admin_time = cleaned_data.get('admin_time') 

     if admin_time: 
      execution_time=admin_time 
     return cleaned_data 

    def save(self, creator, *args, **kwargs): 
     self.instance.creator = creator 
     super(TaskForm, self).save(*args, **kwargs) 
     if kwargs.get('commit', True): 
      self._process_keywords(creator) 
     return self.instance 

    class Media: 
     css = { 
      'all': ('css/admin_ace.css',) 
     } 

    class Meta: 
     model = Task 
     fields = ('name', 'short_description', 'execution_time', 'difficulty', 
       'priority', 'repeatable', 'team', 'project', 'type', 'start_date', 
       'end_date', 'why_this_matters', 'prerequisites', 'instructions', 
       'is_draft', 'is_invalid') 
     widgets = { 
      'name': forms.TextInput(attrs={'size': 100, 'class': 'fill-width'}), 
      'short_description': forms.TextInput(attrs={'size': 100, 'class': 'fill-width'}), 
      'instructions': AceWidget(mode='markdown', theme='textmate', width='800px', 
            height='300px', wordwrap=True, 
            attrs={'class': 'fill-width'}), 
      'start_date': CalendarInput, 
      'end_date': CalendarInput, 
      'why_this_matters': forms.Textarea(attrs={'rows': 2, 'class': 'fill-width'}), 
      'prerequisites': forms.Textarea(attrs={'rows': 4, 'class': 'fill-width'}), 
     } 

我試着在 def clean(self)編輯,但它不工作。當我從views.py

如果admin_time驗證刪除任何幫助,將不勝感激

回答

0

您可以覆蓋的ModelForm的save()方法來做到這一點:

def save(self, commit=True): 
     instance = super(TaskForm, self).save(commit=False) 
     admin_time = self.cleaned_data['admin_time'] 
     if admin_time: 
      instance.execution_time=admin_time 
     instance.save() 
     return instance 
相關問題