예제 #1
0
	def change_view(self, request, object_id, extra_context=None):
		"""Add a hidden field for the object's primary key."""
		model = self.model
		opts = model._meta

		obj = self.get_object(request, unquote(object_id))

		if not self.has_change_permission(request, obj):
			raise PermissionDenied

		if obj is None:
			raise Http404(_('%(name)s object with primary key %(key)r does not exist.') % {'name': force_unicode(opts.verbose_name), 'key': escape(object_id)})

		if request.method == 'POST' and "_saveasnew" in request.POST:
			return self.add_view(request, form_url='../add/')

		ModelForm = self.get_form(request, obj)
		formsets = []
		if request.method == 'POST':
			form = ModelForm(request.POST, request.FILES, instance=obj)
			if form.is_valid():
				form_validated = True
				new_object = self.save_form(request, form, change=True)
			else:
				form_validated = False
				new_object = obj
			prefixes = {}
			for FormSet, inline in zip(self.get_formsets(request, new_object),
									   self.inline_instances):
				prefix = FormSet.get_default_prefix()
				prefixes[prefix] = prefixes.get(prefix, 0) + 1
				if prefixes[prefix] != 1:
					prefix = "%s-%s" % (prefix, prefixes[prefix])
				formset = FormSet(request.POST, request.FILES,
								  instance=new_object, prefix=prefix,
								  queryset=inline.queryset(request))

				formsets.append(formset)

			embedded_formsets=[]
			for FormSet, embedded in zip(self.get_embedded_formsets(request, new_object),
									   self.embedded_instances):
				prefix = FormSet.model._meta.object_name.lower()
				prefixes[prefix] = prefixes.get(prefix, 0) + 1
				if prefixes[prefix] != 1:
					prefix = "%s-%s" % (prefix, prefixes[prefix])
				try:
					formset = FormSet(request.POST, request.FILES, prefix=prefix,
									  queryset=embedded.queryset(request, obj))

					embedded_formsets.append(formset) # this is only to get a complete history messaging
				except:
					pass
				
			if all_valid(formsets) and all_valid(embedded_formsets) and form_validated:
				# we have to update embedded formsets first because we modify the new_object
				for formset in embedded_formsets:
					embedded_data = self.save_embedded_formset(formset, change=True)
					setattr(new_object, formset.model._meta.object_name.lower(), embedded_data)				
				self.save_model(request, new_object, form, change=True)
				form.save_m2m()
				for formset in formsets:
					self.save_formset(request, form, formset, change=True)
					
				change_message = self.construct_change_message(request, form, formsets+embedded_formsets)
				self.log_change(request, new_object, change_message)
				return self.response_change(request, new_object)

		else:
			form = ModelForm(instance=obj)
			prefixes = {}
			for FormSet, inline in zip(self.get_formsets(request, obj), self.inline_instances):
				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=obj, prefix=prefix,
								  queryset=inline.queryset(request))
				formsets.append(formset)
			
			for FormSet, embedded in zip(self.get_embedded_formsets(request, obj), self.embedded_instances):
				prefix = FormSet.model._meta.object_name.lower()
				prefixes[prefix] = prefixes.get(prefix, 0) + 1
				if prefixes[prefix] != 1:
					prefix = "%s-%s" % (prefix, prefixes[prefix])
				formset = FormSet(instance=embedded.model, prefix=prefix,
								  queryset=embedded.queryset(request, obj))
				formsets.append(formset)
				
		adminForm = admin.helpers.AdminForm(form, self.get_fieldsets(request, obj),
			self.prepopulated_fields, self.get_readonly_fields(request, obj),
			model_admin=self)
		media = self.media + adminForm.media

		inline_admin_formsets = []
		for inline, formset in zip(self.inline_instances, formsets):
			fieldsets = list(inline.get_fieldsets(request, obj))
			readonly = list(inline.get_readonly_fields(request, obj))
			inline_admin_formset = admin.helpers.InlineAdminFormSet(inline, formset,
				fieldsets, readonly, model_admin=self)
			inline_admin_formsets.append(inline_admin_formset)
			media = media + inline_admin_formset.media
			
		embedded_admin_formsets=[]
		for embedded, formset in zip(self.embedded_instances, formsets):
			fieldsets = list(embedded.get_fieldsets(request, obj))
			readonly = list(embedded.get_readonly_fields(request, obj))
			embedded_admin_formset = EmbeddedAdminFormSet(embedded, formset,
				fieldsets, readonly, model_admin=self)
			embedded_admin_formsets.append(embedded_admin_formset)
			media = media + embedded_admin_formset.media

		context = {
			'title': _('Change %s') % force_unicode(opts.verbose_name),
			'adminform': adminForm,
			'object_id': object_id,
			'original': obj,
			'is_popup': "_popup" in request.REQUEST,
			'media': mark_safe(media),
			'inline_admin_formsets': inline_admin_formsets,
			'embedded_admin_formsets': embedded_admin_formsets,
			'errors': admin.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, change=True, obj=obj)
예제 #2
0
    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':
            # on précise l'utilisateur dans le formulaire
            form = ModelForm(request.POST, request.FILES, user=request.user)
            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:
                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(",")
            # on précise l'utilisateur dans le formulaire
            form = ModelForm(initial=initial, user=request.user)
            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': request.REQUEST.has_key('_popup'),
            '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)
예제 #3
0
	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():
				new_object = self.save_form(request, form, change=False)
				form_validated = True
			else:
				form_validated = False
				new_object = self.model()
			prefixes = {}
			for FormSet, inline in zip(self.get_formsets(request), self.inline_instances):
				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="_saveasnew" in request.POST,
								  prefix=prefix, queryset=inline.queryset(request))
				formsets.append(formset)

			embedded_formsets = []
			for FormSet, embedded in zip(self.get_embedded_formsets(request, new_object),
									   self.embedded_instances):
				prefix = FormSet.model._meta.object_name.lower()
				prefixes[prefix] = prefixes.get(prefix, 0) + 1
				if prefixes[prefix] != 1:
					prefix = "%s-%s" % (prefix, prefixes[prefix])
				try:
					formset = FormSet(request.POST, request.FILES, prefix=prefix,
									  instance=embedded.model,
									  queryset=embedded.queryset(request))
					embedded_formsets.append(formset) # this is only to get a complete log messaging
				except:
					pass

			if all_valid(formsets) and all_valid(embedded_formsets) and form_validated:
				# we have to update embedded formsets first because we modify the new_object
				for formset in embedded_formsets:
					embedded_data = self.save_embedded_formset(formset, change=False)
					setattr(new_object, formset.model._meta.object_name.lower(), embedded_data)
				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, inline in zip(self.get_formsets(request),
									   self.inline_instances):
				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,
								  queryset=inline.queryset(request))
				formsets.append(formset)

			for FormSet, embedded in zip(self.get_embedded_formsets(request, ), self.embedded_instances):
				prefix = FormSet.model._meta.object_name.lower()
				prefixes[prefix] = prefixes.get(prefix, 0) + 1
				if prefixes[prefix] != 1:
					prefix = "%s-%s" % (prefix, prefixes[prefix])
				formset = FormSet(instance=embedded.model, prefix=prefix,
								  queryset=embedded.queryset(request))
				formsets.append(formset)
				
		adminForm = admin.helpers.AdminForm(form, list(self.get_fieldsets(request)),
			self.prepopulated_fields, self.get_readonly_fields(request),
			model_admin=self)
		media = self.media + adminForm.media

		inline_admin_formsets = []
		for inline, formset in zip(self.inline_instances, formsets):
			fieldsets = list(inline.get_fieldsets(request))
			readonly = list(inline.get_readonly_fields(request))
			inline_admin_formset = admin.helpers.InlineAdminFormSet(inline, formset,
				fieldsets, readonly, model_admin=self)
			inline_admin_formsets.append(inline_admin_formset)
			media = media + inline_admin_formset.media

		embedded_admin_formsets=[]
		for embedded, formset in zip(self.embedded_instances, formsets):
			fieldsets = list(embedded.get_fieldsets(request))
			readonly = list(embedded.get_readonly_fields(request))
			embedded_admin_formset = EmbeddedAdminFormSet(embedded, formset,
				fieldsets, readonly, model_admin=self)
			embedded_admin_formsets.append(embedded_admin_formset)
			media = media + embedded_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,
			'embedded_admin_formsets': embedded_admin_formsets,
			'errors': admin.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)
예제 #4
0
    def change_view(self, request, object_id, extra_context=None):
        "The 'change' admin view for this model."
        model = self.model
        opts = model._meta

        try:
            obj = self.queryset(request).get(pk=unquote(object_id))
        except model.DoesNotExist:
            # Don't raise Http404 just yet, because we haven't checked
            # permissions yet. We don't want an unauthenticated user to be able
            # to determine whether a given object exists.
            obj = None

        if not self.has_change_permission(request, obj):
            raise PermissionDenied

        if obj is None:
            raise Http404(
                _('%(name)s object with primary key %(key)r does not exist.') %
                {
                    'name': force_unicode(opts.verbose_name),
                    'key': escape(object_id)
                })

        if request.method == 'POST' and request.POST.has_key("_saveasnew"):
            return self.add_view(request, form_url='../add/')

        ModelForm = self.get_form(request, obj)
        formsets = []
        if request.method == 'POST':
            # on précise l'utilisateur dans le formulaire
            form = ModelForm(request.POST,
                             request.FILES,
                             instance=obj,
                             user=request.user)
            if form.is_valid():
                form_validated = True
                new_object = self.save_form(request, form, change=True)
            else:
                form_validated = False
                new_object = obj
            prefixes = {}
            for FormSet in self.get_formsets(request, new_object):
                prefix = FormSet.get_default_prefix()
                prefixes[prefix] = prefixes.get(prefix, 0) + 1
                if prefixes[prefix] != 1:
                    prefix = "%s-%s" % (prefix, prefixes[prefix])
                formset = FormSet(request.POST,
                                  request.FILES,
                                  instance=new_object,
                                  prefix=prefix)
                formsets.append(formset)

            if all_valid(formsets) and form_validated:
                self.save_model(request, new_object, form, change=True)
                form.save_m2m()
                for formset in formsets:
                    self.save_formset(request, form, formset, change=True)

                change_message = self.construct_change_message(
                    request, form, formsets)
                self.log_change(request, new_object, change_message)
                return self.response_change(request, new_object)

        else:
            # on précise l'utilisateur dans le formulaire
            form = ModelForm(instance=obj, user=request.user)
            prefixes = {}
            for FormSet in self.get_formsets(request, obj):
                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=obj, prefix=prefix)
                formsets.append(formset)

        adminForm = helpers.AdminForm(form, self.get_fieldsets(request, obj),
                                      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, obj))
            inline_admin_formset = helpers.InlineAdminFormSet(
                inline, formset, fieldsets)
            inline_admin_formsets.append(inline_admin_formset)
            media = media + inline_admin_formset.media

        context = {
            'title': _('Change %s') % force_unicode(opts.verbose_name),
            'adminform': adminForm,
            'object_id': object_id,
            'original': obj,
            'is_popup': request.REQUEST.has_key('_popup'),
            '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, change=True, obj=obj)