python - How to achieve the same function of views.py through extention of clean method of forms? -
python - How to achieve the same function of views.py through extention of clean method of forms? -
my 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') homecoming ctx def form_valid(self, form): form.save(self.request.user) messages.success(self.request, _('your task has been created.')) homecoming 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]) homecoming ctx def form_valid(self, form): form.save(self.request.user) messages.success(self.request, _('your task has been updated.')) homecoming redirect('tasks.list')
my forms.py
class taskform(forms.modelform): keywords = (forms.charfield( help_text=_('please utilize commas separate keywords.'), required=false, widget=forms.textinput(attrs={'class': 'medium-field'}))) admin_time = forms.integerfield( help_text=_('enter if more 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() 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 , end_date: if start_date >= end_date: raise forms.validationerror(_("'end date' must after 'start date'")) homecoming 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) homecoming 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'}), }
i want extend clean method in forms.py , validation before form processed.
that is, tried this- doesnt' work :(
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 , end_date: if start_date >= end_date: raise forms.validationerror(_("'end date' must after 'start date'")) execution_time = cleaned_data.get('execution_time') if cleaned_data.get('admin_time'): self.instance.execution_time = cleaned_data.get('admin_time') homecoming cleaned_data
what want accomplish is, if admin_time present, execution_time should equal admin_time.
any help appreciated. i'm stuck place.
what did first in createtaskview added this:
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.')) homecoming redirect('tasks.list')
and in updatetaskview
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.')) homecoming redirect('tasks.list')
this code worked- duplication of same function in 2 classes need removed. can extention of clean method of forms.py , same functionality done? if admin_time entered in form entry should replace executable_time=admin_time
clean methods should used form validation. since setting execution time same admin time has nil validation, think putting in views appropriate place. why not create mixin , have both createtaskview , updatetaskview consume mixin?
class setexecutiontime(object): def form_valid(self, form): self.object = form.save(self.request.user, commit=false) admin_time = form.cleaned_data['admin_time'] if admin_time: self.object.execution_time = admin_time self.object.save() form.save(self.request.user) # success message/redirect here
then can consume mixin like:
class updatetaskview(loginrequiredmixin, mystaffuserrequiredmixin, setexecutiontime, generic.updateview)
python django
Comments
Post a Comment