Admin site: pass data from AdminModel object to ModelForm object (or another way to pass data to "add" form)

14 views
Skip to first unread message

Артур Скок

unread,
May 30, 2018, 7:21:13 AM5/30/18
to Django users
Globally, we need call "add" form for model in admin site, but with options selected by user:
1. user checks items in "changelist" of objects RepoFile
2. select action "create job"
3. redirect user to standard "add" form for new object DeviceCronJob where field download_files already checked by selected files.
May be there is another way to do it. Variants that i tried is below.

I have add form for appropriate model. This model contains multichoice field:
models.py:

class DeviceCronJob(models.Model):
    ...
    download_files = models.TextField(max_length=250, blank=True, verbose_name=_("Files for downloading"))


forms.py:

class DeviceCronJobAddForm(forms.ModelForm):
    download_files = forms.MultipleChoiceField(
            widget=forms.CheckboxSelectMultiple(),
            choices=[(file.hash, "%s [%s]" % (file.full_name,file.link)) for file in RepoFile.objects.filter()]
        )


All work fine if i use standard admin "add".
I have other model RepoFile and customized Action: "Create download cronjob in template". On selecting files and pushing this action i need to pass selected files to DeviceCronJobAddForm.
i tried this:
admin.py
class DeviceCronJobAdmin(ModelAdmin):
    model = DeviceCronJob
    add_form = DeviceCronJobAddForm
    list_display = ('cron_date', 'template', 'description', 'download_files', 'cron_user', 'cron_path', 'cron_mode', 'cdate')
    ...
    def get_form(self, request, obj=None, **kwargs):
        defaults = {}
        setted = request.GET.get('setted','').split(",")
        if obj is None: # if add new
            if len(setted):
                defaults.update({'form': self.add_form(setted=setted)})
            else:
                defaults.update({'form': self.add_form})
        else: # if change view
            defaults.update({
                'form': self.add_form,
            })
        defaults.update(kwargs)
        return super(DeviceCronJobAdmin, self).get_form(request, obj, **defaults)


models.py:
class DeviceCronJobAddForm(forms.ModelForm):
    ...
    def __init__(self, *args, **kwargs):
        files = kwargs.pop('setted','')
        # actions with files
        super(DeviceCronJobAddForm, self).__init__(*args, **kwargs)

but it raises error: unknown setted in super(DeviceCronJobAddForm, self).__init__(*args, **kwargs)
Also i tried pass selected files like GET arguments, but Form has not access to request object

Reply all
Reply to author
Forward
0 new messages