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
“任务”对象有没有属性“admin_time” 这是我现在得到的错误。 – 2014-11-01 22:34:53
更新了答案... – madzohan 2014-11-01 22:38:10
工作! :) 谢谢!!现在有一个问题。我还有一个类UpdateTaskView(LoginRequiredMixin,MyStaffUserRequiredMixin,generic.UpdateView):def form_valid(self,form):我还可以在那里使用相同的form_valid定义吗? – 2014-11-01 22:44:08