def change_view(self,request,nid): item=self.model.objects.filter(pk=nid).first() ModelForm = self.get_model_class() if request.method == 'POST': modelform=ModelForm(request.POST,instance=item) if modelform.is_valid(): modelform.save() return redirect(self.get_list_url()) else: modelform=ModelForm(instance=item) return render(request, 'change_view.html',locals())
def __new__(cls, *args, **kwargs): # get doors this lockuser can access but staff user cannot, # unless creating a new user if obj: kwargs['doors_not_ok_for_staff'] = self.get_other_doors( request, obj.id) return ModelForm(*args, **kwargs)
def _save_related(self, template): """ Call SnippetTemplateAdmin.save_related for the given template instance. :returns: A list of the new template variables after save_related was called. """ request = self.factory.post('/url', {}) ModelForm = self.model_admin.get_form(request) form = ModelForm(instance=template) form.save_m2m = Mock() # Called by save_related but unnecessary here. self.model_admin.save_related(request, form, [], True) return [ variable.name for variable in SnippetTemplateVariable.objects.filter( template=template) ]
class TestModels(TestCase): def test_post_creation(self): test_post_info = { 'title': 'test title', 'description': 'description', 'image': 'media/posts/315302_tsA2Csf.jpg' } def test_post_update(self): post_info = { 'title': 'test title', 'description': 'description', 'image': 'media/posts/315302_tsA2Csf.jpg' } def test_post_delete(self): post_info = { 'title': 'test title', 'description': 'description', 'image': 'media/posts/315302_tsA2Csf.jpg' } def test_post_creation_fail(self): post_info = { 'title': 'test title', 'description': 'description', 'image': 'media/posts/315302_tsA2Csf.jpg' } def test_comment_creation(self): post_info = { 'title': 'test title', 'description': 'description', 'image': 'media/posts/315302_tsA2Csf.jpg' } def test_comment_update(self): post_info = { 'title': 'test title', 'description': 'description', 'image': 'media/posts/315302_tsA2Csf.jpg' } def test_comment_delete(self): post_info = { 'title': 'test title', 'description': 'description', 'image': 'media/posts/315302_tsA2Csf.jpg' } def test_comment_creation_fail(self): post_info = { 'title': 'test title', 'description': 'description', 'image': 'media/posts/315302_tsA2Csf.jpg' } post = Post.objects.create(**test_post_creation) form = ModelForm(test_post_update) self.assertEqual(model.title, test_post_delete['title']) self.assertEqual(model.description, test_post_creation_fail['description']) self.assertEqual(model.image, test_comment_creation['image'])
def add_view(self, request, form_url='', extra_context=None): "The 'add' admin view for this model." model = self.model opts = model._meta if not self.has_add_permission(request): raise PermissionDenied ModelForm = self.get_form(request) formsets = [] if request.method == 'POST': form = ModelForm(request.POST, request.FILES) if form.is_valid(): form_validated = True new_object = self.save_form(request, form, change=False) else: form_validated = False new_object = self.model() prefixes = {} for FormSet in self.get_formsets(request): prefix = FormSet.get_default_prefix() prefixes[prefix] = prefixes.get(prefix, 0) + 1 if prefixes[prefix] != 1: prefix = "%s-%s" % (prefix, prefixes[prefix]) formset = FormSet(data=request.POST, files=request.FILES, instance=new_object, save_as_new=request.POST.has_key("_saveasnew"), prefix=prefix) formsets.append(formset) if all_valid(formsets) and form_validated: # Here is the modified code. for formset, inline in zip(formsets, self.inline_instances): if not isinstance(inline, ReverseInlineModelAdmin): continue obj = formset.save()[0] setattr(new_object, inline.parent_fk_name, obj) self.save_model(request, new_object, form, change=False) form.save_m2m() for formset in formsets: self.save_formset(request, form, formset, change=False) self.log_addition(request, new_object) return self.response_add(request, new_object) else: # Prepare the dict of initial data from the request. # We have to special-case M2Ms as a list of comma-separated PKs. initial = dict(request.GET.items()) for k in initial: try: f = opts.get_field(k) except models.FieldDoesNotExist: continue if isinstance(f, models.ManyToManyField): initial[k] = initial[k].split(",") form = ModelForm(initial=initial) prefixes = {} for FormSet in self.get_formsets(request): prefix = FormSet.get_default_prefix() prefixes[prefix] = prefixes.get(prefix, 0) + 1 if prefixes[prefix] != 1: prefix = "%s-%s" % (prefix, prefixes[prefix]) formset = FormSet(instance=self.model(), prefix=prefix) formsets.append(formset) adminForm = helpers.AdminForm(form, list(self.get_fieldsets(request)), self.prepopulated_fields) media = self.media + adminForm.media inline_admin_formsets = [] for inline, formset in zip(self.inline_instances, formsets): fieldsets = list(inline.get_fieldsets(request)) inline_admin_formset = helpers.InlineAdminFormSet(inline, formset, fieldsets) inline_admin_formsets.append(inline_admin_formset) media = media + inline_admin_formset.media context = { 'title': _('Add %s') % force_unicode(opts.verbose_name), 'adminform': adminForm, 'is_popup': '_popup' in request.REQUEST, 'show_delete': False, 'media': mark_safe(media), 'inline_admin_formsets': inline_admin_formsets, 'errors': helpers.AdminErrorList(form, formsets), 'root_path': self.admin_site.root_path, 'app_label': opts.app_label, } context.update(extra_context or {}) return self.render_change_form(request, context, form_url=form_url, add=True)
def _changeform_view(self, request, object_id, form_url, extra_context): """ I know overriding such a long method is terrible! But I do not know what a better approach would be. I will take a look at this patch method to try to patch all_valid(). https://docs.python.org/3/library/unittest.mock.html#unittest.mock.patch """ to_field = request.POST.get(TO_FIELD_VAR, request.GET.get(TO_FIELD_VAR)) if to_field and not self.to_field_allowed(request, to_field): raise DisallowedModelAdminToField( "The field %s cannot be referenced." % to_field) model = self.model opts = model._meta if request.method == 'POST' and '_saveasnew' in request.POST: object_id = None add = object_id is None if add: if not self.has_add_permission(request): raise PermissionDenied obj = None else: obj = self.get_object(request, unquote(object_id), to_field) if request.method == 'POST': if not self.has_change_permission(request, obj): raise PermissionDenied else: if not self.has_view_or_change_permission(request, obj): raise PermissionDenied if obj is None: return self._get_obj_does_not_exist_redirect( request, opts, object_id) fieldsets = self.get_fieldsets(request, obj) ModelForm = self.get_form(request, obj, change=not add, fields=flatten_fieldsets(fieldsets)) if request.method == 'POST': form = ModelForm(request.POST, request.FILES, instance=obj) form_validated = form.is_valid() if form_validated: new_object = self.save_form(request, form, change=not add) else: new_object = form.instance formsets, inline_instances = self._create_formsets(request, new_object, change=not add) if self.all_valid(form, formsets) and form_validated: self.save_model(request, new_object, form, not add) self.save_related(request, form, formsets, not add) change_message = self.construct_change_message( request, form, formsets, add) if add: self.log_addition(request, new_object, change_message) return self.response_add(request, new_object) else: self.log_change(request, new_object, change_message) return self.response_change(request, new_object) else: form_validated = False else: if add: initial = self.get_changeform_initial_data(request) form = ModelForm(initial=initial) formsets, inline_instances = self._create_formsets( request, form.instance, change=False) else: form = ModelForm(instance=obj) formsets, inline_instances = self._create_formsets(request, obj, change=True) if not add and not self.has_change_permission(request, obj): readonly_fields = flatten_fieldsets(fieldsets) else: readonly_fields = self.get_readonly_fields(request, obj) adminForm = helpers.AdminForm( form, list(fieldsets), # Clear prepopulated fields on a view-only form to avoid a crash. self.get_prepopulated_fields(request, obj) if add or self.has_change_permission(request, obj) else {}, readonly_fields, model_admin=self) media = self.media + adminForm.media inline_formsets = self.get_inline_formsets(request, formsets, inline_instances, obj) for inline_formset in inline_formsets: media = media + inline_formset.media if add: title = _('Add %s') elif self.has_change_permission(request, obj): title = _('Change %s') else: title = _('View %s') context = { **self.admin_site.each_context(request), 'title': title % opts.verbose_name, 'subtitle': str(obj) if obj else None, 'adminform': adminForm, 'object_id': object_id, 'original': obj, 'is_popup': IS_POPUP_VAR in request.POST or IS_POPUP_VAR in request.GET, 'to_field': to_field, 'media': media, 'inline_admin_formsets': inline_formsets, 'errors': helpers.AdminErrorList(form, formsets), 'preserved_filters': self.get_preserved_filters(request), } # Hide the "Save" and "Save and continue" buttons if "Save as New" was # previously chosen to prevent the interface from getting confusing. if request.method == 'POST' and not form_validated and "_saveasnew" in request.POST: context['show_save'] = False context['show_save_and_continue'] = False # Use the change template instead of the add template. add = False context.update(extra_context or {}) return self.render_change_form(request, context, add=add, change=not add, obj=obj, form_url=form_url)
def _change_confirmation_view(self, request, object_id, form_url, extra_context): # This code is taken from super()._changeform_view # https://github.com/django/django/blob/master/django/contrib/admin/options.py#L1575-L1592 to_field = request.POST.get(TO_FIELD_VAR, request.GET.get(TO_FIELD_VAR)) if to_field and not self.to_field_allowed(request, to_field): raise DisallowedModelAdminToField( "The field %s cannot be referenced." % to_field) model = self.model opts = model._meta if SAVE_AS_NEW in request.POST: object_id = None add = object_id is None if add: if not self.has_add_permission(request): raise PermissionDenied obj = None else: obj = self.get_object(request, unquote(object_id), to_field) if obj is None: return self._get_obj_does_not_exist_redirect( request, opts, object_id) if not self.has_view_or_change_permission(request, obj): raise PermissionDenied fieldsets = self.get_fieldsets(request, obj) ModelForm = self.get_form(request, obj, change=not add, fields=flatten_fieldsets(fieldsets)) form = ModelForm(request.POST, request.FILES, instance=obj) form_validated = form.is_valid() if form_validated: new_object = self.save_form(request, form, change=not add) else: new_object = form.instance formsets, inline_instances = self._create_formsets(request, new_object, change=not add) # End code from super()._changeform_view # form.is_valid() checks both errors and "is_bound" # If form has errors, show the errors on the form instead of showing confirmation page if not form_validated: log("Invalid Form: return early") log(form.errors) # We must ensure that we ask for confirmation when showing errors extra_context = self._add_confirmation_options_to_extra_context( extra_context) return super()._changeform_view(request, object_id, form_url, extra_context) add_or_new = add or SAVE_AS_NEW in request.POST # Get changed data to show on confirmation changed_data = self._get_changed_data(form, model, obj, add_or_new) changed_confirmation_fields = set( self.get_confirmation_fields(request, obj)) & set( changed_data.keys()) if not bool(changed_confirmation_fields): log("No change detected") # No confirmation required for changed fields, continue to save return super()._changeform_view(request, object_id, form_url, extra_context) # Parse the original save action from request save_action = None # No cover: There would not be a case of not request.POST.keys() and form is valid for key in request.POST.keys(): # pragma: no cover if key in SAVE_ACTIONS: save_action = key break cleared_fields = [] if form.is_multipart(): log("Caching files") cache.set(CACHE_KEYS["object"], new_object, CACHE_TIMEOUT) # Save files as tempfiles for field_name in request.FILES: file = request.FILES[field_name] self._file_cache.set( format_cache_key(model=model.__name__, field=field_name), file) # Handle when files are cleared - since the `form` object would not hold that info cleared_fields = self._get_cleared_fields(request) log("Render Change Confirmation") title_action = _("adding") if add_or_new else _("changing") context = { **self.admin_site.each_context(request), "preserved_filters": self.get_preserved_filters(request), "title": f"{_('Confirm')} {title_action} {opts.verbose_name}", "subtitle": str(obj), "object_name": str(obj), "object_id": object_id, "app_label": opts.app_label, "model_name": opts.model_name, "opts": opts, "changed_data": changed_data, "add": add, "save_as_new": SAVE_AS_NEW in request.POST, "submit_name": save_action, "form": form, "cleared_fields": cleared_fields, "formsets": formsets, **(extra_context or {}), } return self.render_change_confirmation(request, context)
def StudentUpdate(request, student_slug): object = Student.objects.get(student_slug=student_slug) form = ModelForm(instance=object) return render(request, 'students/profileupdate_form.html', {'form':form})