2014-11-01 65 views
0

views.py无法比较和更新表单域和模型领域的Django

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): 
    admin_time = form.cleaned_data['admin_time'] 
    if admin_time: 
     Task.execution_time=admin_time 
    form.save(self.request.user) 

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

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'")) 
    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'}), 
    } 

form.html

<fieldset class="task-info"> 
    {{ form_field(task_form['execution_time']) }} 
    {{ form_field(task_form['admin_time'], help_text=False) }} 
    {{ form_field(task_form['difficulty']) }} 
    {{ form_field(task_form['priority']) }} 
</fieldset> 

我有execution_time和admin_time我的html页面上的两个字段。 表单正在处理如果admin_time存在,我希望将execution_time更改为admin_time, 即execution_time = admin_time。

我已经在 def form_valid(self,form)中的views.py中添加了相同的内容:但它不起作用。

execution_time在models.py

Class Task(CachedModel, CreatedModifiedModel, CreatedByModel): 
    execution_time = models.IntegerField(
    choices=((i, i) for i in (15, 30, 45, 60)), 
    blank=False, 
    default=30, 
    verbose_name='estimated time' 
) 

我想达到同一给定不添加模型admin_time。

我多了一个班,我views.py

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): 
    form.save(self.request.user) 

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

如果admin_time的值发生变化时编辑 - 那么它也应该回答以下正在更新

:我想更深入的是,我可以把代码放在forms.py中吗?作为一个单一的功能?

在forms.py中添加这个函数会起作用还是需要做出更多的更改?

def clean_execution_time(self): 
cleaned_data = super(TaskForm, self).clean() 
data = cleaned_data.get('execution_time') 
admin_time = cleaned_data.get('admin_time') 
if admin_time: 
    data=admin_time 
return data 

回答

1
# for create and update view 
def form_valid(self, form): 
    admin_time = form.cleaned_data.get('admin_time') 
    task_object = form.save(self.request.user, commit=False) 
    if admin_time: 
     task_object.execution_time = admin_time 
    task_object.save(self.request.user) 


# update 
def clean_execution_time(self): 
    execution_time = self.cleaned_data.get('execution_time') 
    admin_time = self.cleaned_data.get('admin_time') 
    if admin_time: 
     self.cleaned_data['execution_time'] = execution_time = admin_time 

    return execution_time 
+0

“任务”对象有没有属性“admin_time” 这是我现在得到的错误。 – 2014-11-01 22:34:53

+0

更新了答案... – madzohan 2014-11-01 22:38:10

+0

工作! :) 谢谢!!现在有一个问题。我还有一个类UpdateTaskView(LoginRequiredMixin,MyStaffUserRequiredMixin,generic.UpdateView):def form_valid(self,form):我还可以在那里使用相同的form_valid定义吗? – 2014-11-01 22:44:08