Exemplo n.º 1
0
    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        db = kwargs.get('using')

        if db_field.name in self.get_autocomplete_fields(request):
            kwargs['widget'] = AutocompleteSelect(db_field.remote_field,
                                                  self.admin_site,
                                                  using=db)
        elif db_field.name in self.raw_id_fields:
            kwargs['widget'] = widgets.ForeignKeyRawIdWidget(
                db_field.remote_field, self.admin_site, using=db)
        elif db_field.name in self.radio_fields:
            kwargs['widget'] = widgets.AdminRadioSelect(
                attrs={
                    'class': get_ul_class(self.radio_fields[db_field.name]),
                })
            kwargs['empty_label'] = gettext('None') if db_field.blank else None

        if db_field.name == 'image':
            kwargs['widget'] = widgets.ForeignKeyRawIdWidget(
                db_field.remote_field, self.admin_site, using=db)

        if 'queryset' not in kwargs:
            queryset = self.get_field_queryset(db, db_field, request)
            if queryset is not None:
                kwargs['queryset'] = queryset
        return super(PlaceArticleInline,
                     self).formfield_for_foreignkey(db_field, request,
                                                    **kwargs)
Exemplo n.º 2
0
class ResourceAdminForm(forms.ModelForm):
    division = forms.ModelChoiceField(
        label=FIELDS['agency_division'],
        widget=widgets.ForeignKeyRawIdWidget(
            Resource._meta.get_field('division').rel, site),
        queryset=Division.objects,
        required=False)
    categories = forms.ModelMultipleChoiceField(
        queryset=Category.objects,
        widget=widgets.FilteredSelectMultiple("categories", False))
    data_types = forms.ModelMultipleChoiceField(
        queryset=DataType.objects,
        widget=widgets.FilteredSelectMultiple("Data types", False))
    department = forms.ModelChoiceField(
        label=FIELDS['agency_name'],
        widget=widgets.ForeignKeyRawIdWidget(
            Resource._meta.get_field('department').rel, site),
        queryset=Department.objects)
    agency_type = forms.ChoiceField(choices=Resource.AGENCY_TYPES,
                                    label=FIELDS['agency_type'])
    newest_record = forms.DateField(label=FIELDS['newest_updated'],
                                    required=False,
                                    widget=widgets.AdminDateWidget)
    oldest_record = forms.DateField(label=FIELDS['oldest_record'],
                                    required=False,
                                    widget=widgets.AdminDateWidget)
    updates = forms.ModelChoiceField(label=FIELDS['update_frequency'],
                                     queryset=UpdateFrequency.objects,
                                     required=False)

    class Meta:
        model = Resource
Exemplo n.º 3
0
def adminform_formfield(db_field, **kwargs):
    """
    Enables admin form widgets when used as formfield_callback.
    Use with CAUTION as using admin widgets is at your risk :)
    """
    if db_field.choices:
        return db_field.formfield(**kwargs)

    if isinstance(db_field, (models.ForeignKey, models.ManyToManyField)):
        if isinstance(db_field, models.ForeignKey):
            kwargs['widget'] = widgets.ForeignKeyRawIdWidget(db_field.rel)

        elif isinstance(db_field, models.ManyToManyField):
            kwargs['widget'] = widgets.ManyToManyRawIdWidget(db_field.rel)
        formfield = db_field.formfield(**kwargs)

        if formfield:
            #            related_modeladmin = admin.site._registry.get(db_field.rel.to)
            #            can_add_related = bool(related_modeladmin and
            #                            related_modeladmin.has_add_permission(request))
            formfield.widget = widgets.RelatedFieldWidgetWrapper(
                formfield.widget,
                db_field.rel,
                admin.site,
                can_add_related=True)

    for klass in db_field.__class__.mro():
        if klass in FORMFIELD_FOR_DBFIELD_DEFAULTS:
            kwargs = dict(FORMFIELD_FOR_DBFIELD_DEFAULTS[klass], **kwargs)
            return db_field.formfield(**kwargs)

    return db_field.formfield(**kwargs)
Exemplo n.º 4
0
class ForeignKeyRawIdWidgetForm(forms.Form):
    description = "ForeignKeyRawIdWidget"

    field1 = forms.ModelChoiceField(
        help_text='default', queryset=Permission.objects.all(),
        widget=widgets.ForeignKeyRawIdWidget(
            rel=Permission._meta.get_field('content_type').remote_field,
            admin_site=admin_site))
Exemplo n.º 5
0
class ResourceAdminForm(forms.ModelForm):
    description = MiniWYSIWYGField()
    division = forms.ModelChoiceField(
        label=FIELDS['agency_division'],
        widget=widgets.ForeignKeyRawIdWidget(
            Resource._meta.get_field('division').rel, site),
        queryset=Division.objects,
        required=False)
    categories = forms.ModelMultipleChoiceField(
        queryset=Category.objects,
        widget=widgets.FilteredSelectMultiple("categories", False))
    data_types = forms.ModelMultipleChoiceField(
        queryset=DataType.objects,
        widget=widgets.FilteredSelectMultiple("Data types", False))
    department = forms.ModelChoiceField(
        label=FIELDS['agency_name'],
        widget=widgets.ForeignKeyRawIdWidget(
            Resource._meta.get_field('department').rel, site),
        queryset=Department.objects)
    agency_type = forms.ChoiceField(choices=Resource.AGENCY_TYPES,
                                    label=FIELDS['agency_type'])
    newest_record = forms.DateField(label=FIELDS['newest_updated'],
                                    required=False,
                                    widget=widgets.AdminDateWidget)
    oldest_record = forms.DateField(label=FIELDS['oldest_record'],
                                    required=False,
                                    widget=widgets.AdminDateWidget)
    updates = forms.ModelChoiceField(label=FIELDS['update_frequency'],
                                     queryset=UpdateFrequency.objects,
                                     required=False)

    def clean_name(self):
        name = self.cleaned_data['name']
        if not self.instance.pk:
            slug = slugify(name)
            resources = Resource.objects.filter(slug=slug)
            if resources:
                raise forms.ValidationError(
                    "Resource with this name already exists.")
        return name

    class Meta:
        model = Resource

    class Media:
        js = ("js/wysiwyg.js", )
Exemplo n.º 6
0
class BankAccountExchangeForm(forms.Form):
    from_bank_account = forms.ModelChoiceField(
        queryset=BankAccount.objects.all(),
        widget=widgets.ForeignKeyRawIdWidget(
            TelegramChannel._meta.get_field('sheba').remote_field, admin_site),
    )
    to_bank_account = forms.ModelChoiceField(
        queryset=BankAccount.objects.all(),
        widget=widgets.ForeignKeyRawIdWidget(
            TelegramChannel._meta.get_field('sheba').remote_field, admin_site),
    )

    def clean(self):
        cleaned_data = super().clean()
        fba = cleaned_data.get('from_bank_account')
        tba = cleaned_data.get('to_bank_account')
        if fba == tba:
            raise ValidationError("these two fields shouldn't be same")
Exemplo n.º 7
0
class FooForm(forms.ModelForm):
    bar = forms.ModelChoiceField(queryset=Bar.all_objects,
                                 label=_("Bar"),
                                 widget=widgets.ForeignKeyRawIdWidget(
                                     RelWrapper(
                                         Foo._meta.get_field('bar').rel,
                                         Bar.all_objects)))

    class Meta:
        model = Foo
Exemplo n.º 8
0
    def test_render(self):
        band = models.Band.objects.create(name='Linkin Park')
        band.album_set.create(name='Hybrid Theory',
                              cover_art=r'albums\hybrid_theory.jpg')
        rel = models.Album._meta.get_field('band').rel

        w = widgets.ForeignKeyRawIdWidget(rel, widget_admin_site)
        self.assertHTMLEqual(
            w.render('test', band.pk, attrs={}),
            '<input type="text" name="test" value="%(bandpk)s" class="vForeignKeyRawIdAdminField" /><a href="/widget_admin/admin_widgets/band/?_to_field=id" class="related-lookup" id="lookup_id_test" onclick="return showRelatedObjectLookupPopup(this);"> <img src="%(ADMIN_STATIC_PREFIX)simg/selector-search.gif" width="16" height="16" alt="Lookup" /></a>&nbsp;<strong>Linkin Park</strong>'
            % dict(admin_static_prefix(), bandpk=band.pk))
Exemplo n.º 9
0
    def test_fk_related_model_not_in_admin(self):
        # FK to a model not registered with admin site. Raw ID widget should
        # have no magnifying glass link. See #16542
        big_honeycomb = models.Honeycomb.objects.create(location='Old tree')
        big_honeycomb.bee_set.create()
        rel = models.Bee._meta.get_field('honeycomb').rel

        w = widgets.ForeignKeyRawIdWidget(rel, widget_admin_site)
        self.assertHTMLEqual(
            w.render('honeycomb_widget', big_honeycomb.pk, attrs={}),
            '<input type="text" name="honeycomb_widget" value="%(hcombpk)s" />&nbsp;<strong>Honeycomb object</strong>'
            % {'hcombpk': big_honeycomb.pk})
Exemplo n.º 10
0
    def test_fk_to_self_model_not_in_admin(self):
        # FK to self, not registered with admin site. Raw ID widget should have
        # no magnifying glass link. See #16542
        subject1 = models.Individual.objects.create(name='Subject #1')
        models.Individual.objects.create(name='Child', parent=subject1)
        rel = models.Individual._meta.get_field('parent').rel

        w = widgets.ForeignKeyRawIdWidget(rel, widget_admin_site)
        self.assertHTMLEqual(
            w.render('individual_widget', subject1.pk, attrs={}),
            '<input type="text" name="individual_widget" value="%(subj1pk)s" />&nbsp;<strong>Individual object</strong>'
            % {'subj1pk': subject1.pk})
Exemplo n.º 11
0
    def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
        # copied from django.contrib.admin.wigets so we can override the label_for_value function
        # for the test raw id widget
        db = kwargs.get('using')
        if db_field.name == "test":
            widget = widgets.ForeignKeyRawIdWidget(db_field.rel,
                                                   self.admin_site,
                                                   using=db)
            widget.label_for_value = self.label_for_value
            kwargs['widget'] = widget

        elif db_field.name in self.raw_id_fields:
            kwargs['widget'] = widgets.ForeignKeyRawIdWidget(db_field.rel,
                                                             self.admin_site,
                                                             using=db)
        elif db_field.name in self.radio_fields:
            kwargs['widget'] = widgets.AdminRadioSelect(attrs={
                'class':
                options.get_ul_class(self.radio_fields[db_field.name]),
            })
            kwargs['empty_label'] = db_field.blank and _('None') or None
        return db_field.formfield(**kwargs)
Exemplo n.º 12
0
    def test_proper_manager_for_label_lookup(self):
        # see #9258
        rel = models.Inventory._meta.get_field('parent').rel
        w = widgets.ForeignKeyRawIdWidget(rel, widget_admin_site)

        hidden = models.Inventory.objects.create(barcode=93,
                                                 name='Hidden',
                                                 hidden=True)
        child_of_hidden = models.Inventory.objects.create(
            barcode=94, name='Child of hidden', parent=hidden)
        self.assertHTMLEqual(
            w.render('test', child_of_hidden.parent_id, attrs={}),
            '<input type="text" name="test" value="93" class="vForeignKeyRawIdAdminField" /><a href="/widget_admin/admin_widgets/inventory/?_to_field=barcode" class="related-lookup" id="lookup_id_test" onclick="return showRelatedObjectLookupPopup(this);"> <img src="%(ADMIN_STATIC_PREFIX)simg/selector-search.gif" width="16" height="16" alt="Lookup" /></a>&nbsp;<strong>Hidden</strong>'
            % admin_static_prefix())
Exemplo n.º 13
0
    def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
        """
        Get a form Field for a ForeignKey.
        """
        if db_field.name in self.raw_id_fields:
            kwargs['widget'] = widgets.ForeignKeyRawIdWidget(db_field.rel)
        elif db_field.name in self.radio_fields:
            kwargs['widget'] = widgets.AdminRadioSelect(
                attrs={
                    'class': get_ul_class(self.radio_fields[db_field.name]),
                })
            kwargs['empty_label'] = db_field.blank and _('None') or None

        return db_field.formfield(**kwargs)
Exemplo n.º 14
0
 def test_relations_to_non_primary_key(self):
     # Check that ForeignKeyRawIdWidget works with fields which aren't
     # related to the model's primary key.
     apple = models.Inventory.objects.create(barcode=86, name='Apple')
     models.Inventory.objects.create(barcode=22, name='Pear')
     core = models.Inventory.objects.create(barcode=87,
                                            name='Core',
                                            parent=apple)
     rel = models.Inventory._meta.get_field('parent').rel
     w = widgets.ForeignKeyRawIdWidget(rel, widget_admin_site)
     self.assertHTMLEqual(
         w.render('test', core.parent_id, attrs={}),
         '<input type="text" name="test" value="86" class="vForeignKeyRawIdAdminField" /><a href="/widget_admin/admin_widgets/inventory/?_to_field=barcode" class="related-lookup" id="lookup_id_test" onclick="return showRelatedObjectLookupPopup(this);"> <img src="%(ADMIN_STATIC_PREFIX)simg/selector-search.gif" width="16" height="16" alt="Lookup" /></a>&nbsp;<strong>Apple</strong>'
         % admin_static_prefix())
Exemplo n.º 15
0
    def test_render(self):
        band = models.Band.objects.create(name='Linkin Park')
        band.album_set.create(
            name='Hybrid Theory', cover_art=r'albums\hybrid_theory.jpg'
        )
        rel = models.Album._meta.get_field('band').rel

        w = widgets.ForeignKeyRawIdWidget(rel, widget_admin_site)
        self.assertHTMLEqual(
            w.render('test', band.pk, attrs={}), (
                '<input type="text" name="test" value="%(bandpk)s" class="vForeignKeyRawIdAdminField" />'
                '<a href="/admin_widgets/band/?_to_field=id" class="related-lookup" id="lookup_id_test" title="Lookup"></a>'
                '&nbsp;<strong>Linkin Park</strong>'
            ) % {'bandpk': band.pk}
        )
Exemplo n.º 16
0
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        if self.instance.pk and self.instance.cinema_hall:
            cinema = self.instance.cinema_hall.cinema
            self.fields['cinema_hall'].queryset = CinemaHall.objects.filter(
                cinema=cinema)

            self.fields['film'].queryset = Film.objects.filter(
                agreements__in=cinema.get_agreements().filter_by_date(
                    self.instance.date)).distinct()

        else:
            rel = ManyToOneRel(models.models.ForeignKey, models.CinemaHall,
                               'id')
            self.fields['cinema_hall'].widget = widgets.ForeignKeyRawIdWidget(
                rel, site)
Exemplo n.º 17
0
 def test_relations_to_non_primary_key(self):
     # Check that ForeignKeyRawIdWidget works with fields which aren't
     # related to the model's primary key.
     apple = models.Inventory.objects.create(barcode=86, name='Apple')
     models.Inventory.objects.create(barcode=22, name='Pear')
     core = models.Inventory.objects.create(
         barcode=87, name='Core', parent=apple
     )
     rel = models.Inventory._meta.get_field('parent').rel
     w = widgets.ForeignKeyRawIdWidget(rel, widget_admin_site)
     self.assertHTMLEqual(
         w.render('test', core.parent_id, attrs={}), (
             '<input type="text" name="test" value="86" class="vForeignKeyRawIdAdminField" />'
             '<a href="/admin_widgets/inventory/?_to_field=barcode" class="related-lookup" id="lookup_id_test" title="Lookup">'
             '</a>&nbsp;<strong>Apple</strong>'
         )
     )
Exemplo n.º 18
0
    def test_proper_manager_for_label_lookup(self):
        # see #9258
        rel = models.Inventory._meta.get_field('parent').rel
        w = widgets.ForeignKeyRawIdWidget(rel, widget_admin_site)

        hidden = models.Inventory.objects.create(
            barcode=93, name='Hidden', hidden=True
        )
        child_of_hidden = models.Inventory.objects.create(
            barcode=94, name='Child of hidden', parent=hidden
        )
        self.assertHTMLEqual(
            w.render('test', child_of_hidden.parent_id, attrs={}), (
                '<input type="text" name="test" value="93" class="vForeignKeyRawIdAdminField" />'
                '<a href="/admin_widgets/inventory/?_to_field=barcode" class="related-lookup" id="lookup_id_test" title="Lookup">'
                '</a>&nbsp;<strong>Hidden</strong>'
            )
        )
Exemplo n.º 19
0
    def formfield_for_foreignkey(self, db_field, **kwargs):
        """
        Get a form Field for a ForeignKey.
        """
        db = kwargs.get('using')
        if db_field.name in self.raw_id_fields:
            kwargs['widget'] = widgets.ForeignKeyRawIdWidget(db_field.remote_field, self, using=db)
        elif db_field.name in self.radio_fields:
            kwargs['widget'] = widgets.RadioSelect(attrs={
                'class': get_ul_class(self.radio_fields[db_field.name]),
            })
            kwargs['empty_label'] = _('None') if db_field.blank else None

        if 'queryset' not in kwargs:
            queryset = self.get_field_queryset(db, db_field)
            if queryset is not None:
                kwargs['queryset'] = queryset

        return db_field.formfield(**kwargs)
Exemplo n.º 20
0
class CertificateForm(forms.ModelForm):
    KeyFile = forms.FileField(label=_('KeyFile'), required=False)
    FDomain = forms.ModelChoiceField(
        queryset=Domain.objects.all(),
        label=_('Domain'),
        required=False,
        widget=widgets.ForeignKeyRawIdWidget(
            rel=Certificate._meta.get_field('FDomain').remote_field,
            admin_site=site))
    Domain = forms.CharField(label=_('Domain'), required=False)
    Status = forms.CharField(label=_('Status'), required=False)
    Password = forms.CharField(label=_('Password'), required=False)
    ExpireDate = forms.DateTimeField(label=_("Expire Date"),
                                     required=False,
                                     widget=widgets.AdminSplitDateTime)

    def __init__(self, *args, **kwargs):
        super(CertificateForm, self).__init__(*args, **kwargs)

    class Meta:
        model = Certificate
        fields = [
            'Name', 'FDomain', 'Domain', 'Password', 'KeyFile', 'Status',
            'ExpireDate', 'CreateDate'
        ]

    def save(self, commit=True):
        instance = super(CertificateForm, self).save(commit=False)
        try:
            instance.Key = self.cleaned_data['KeyFile'].read()
        except:
            pass
        try:
            oj = Certificate.objects.get_by_id(instance.uuid)
            if (not oj) or (oj.Password != instance.Password):
                instance.Password = encrypt_ecb(instance.Password)
        except:
            pass
        return instance
Exemplo n.º 21
0
    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        """
        Get a form Field for a ForeignKey.
        """
        db = kwargs.get("using")

        if db_field.name in self.get_autocomplete_fields(request):
            # BEGIN CUSTOMIZATION

            kwargs["widget"] = SemanticAutocompleteSelect(db_field,
                                                          self.admin_site,
                                                          using=db)

            # END CUSTOMIZATION

        elif db_field.name in self.raw_id_fields:
            # TODO
            kwargs["widget"] = widgets.ForeignKeyRawIdWidget(
                db_field.remote_field, self.admin_site, using=db)
        elif db_field.name in self.radio_fields:
            kwargs["widget"] = SemanticRadioSelect(
                attrs={
                    "class": get_ul_class(self.radio_fields[db_field.name])
                })
            kwargs["empty_label"] = _("None") if db_field.blank else None

        if "queryset" not in kwargs:
            queryset = self.get_field_queryset(db, db_field, request)
            if queryset is not None:
                kwargs["queryset"] = queryset

        # BEGIN CUSTOMIZATION
        if "widget" not in kwargs:
            kwargs["widget"] = SemanticSelect()
        # END CUSTOMIZATION

        return db_field.formfield(**kwargs)
Exemplo n.º 22
0
    def formfield_for_dbfield(self, db_field, **kwargs):
        """
        Hook for specifying the form Field instance for a given database Field
        instance.

        If kwargs are given, they're passed to the form Field's constructor.
        """

        # If the field specifies choices, we don't need to look for special
        # admin widgets - we just need to use a select widget of some kind.
        if db_field.choices:
            if db_field.name in self.radio_fields:
                # If the field is named as a radio_field, use a RadioSelect
                kwargs['widget'] = widgets.AdminRadioSelect(attrs={
                    'class':
                    get_ul_class(self.radio_fields[db_field.name]),
                })
                kwargs['choices'] = db_field.get_choices(
                    include_blank=db_field.blank,
                    blank_choice=[('', _('None'))])
                return db_field.formfield(**kwargs)
            else:
                # Otherwise, use the default select widget.
                return db_field.formfield(**kwargs)

        # For DateTimeFields, use a special field and widget.
        if isinstance(db_field, models.DateTimeField):
            kwargs['form_class'] = forms.SplitDateTimeField
            kwargs['widget'] = widgets.AdminSplitDateTime()
            return db_field.formfield(**kwargs)

        # For DateFields, add a custom CSS class.
        if isinstance(db_field, models.DateField):
            kwargs['widget'] = widgets.AdminDateWidget
            return db_field.formfield(**kwargs)

        # For TimeFields, add a custom CSS class.
        if isinstance(db_field, models.TimeField):
            kwargs['widget'] = widgets.AdminTimeWidget
            return db_field.formfield(**kwargs)

        # For TextFields, add a custom CSS class.
        if isinstance(db_field, models.TextField):
            kwargs['widget'] = widgets.AdminTextareaWidget
            return db_field.formfield(**kwargs)

        # For URLFields, add a custom CSS class.
        if isinstance(db_field, models.URLField):
            kwargs['widget'] = widgets.AdminURLFieldWidget
            return db_field.formfield(**kwargs)

        # For IntegerFields, add a custom CSS class.
        if isinstance(db_field, models.IntegerField):
            kwargs['widget'] = widgets.AdminIntegerFieldWidget
            return db_field.formfield(**kwargs)

        # For CommaSeparatedIntegerFields, add a custom CSS class.
        if isinstance(db_field, models.CommaSeparatedIntegerField):
            kwargs['widget'] = widgets.AdminCommaSeparatedIntegerFieldWidget
            return db_field.formfield(**kwargs)

        # For TextInputs, add a custom CSS class.
        if isinstance(db_field, models.CharField):
            kwargs['widget'] = widgets.AdminTextInputWidget
            return db_field.formfield(**kwargs)

        # For FileFields and ImageFields add a link to the current file.
        if isinstance(db_field, models.ImageField) or isinstance(
                db_field, models.FileField):
            kwargs['widget'] = widgets.AdminFileWidget
            return db_field.formfield(**kwargs)

        # For ForeignKey or ManyToManyFields, use a special widget.
        if isinstance(db_field, (models.ForeignKey, models.ManyToManyField)):
            if isinstance(
                    db_field,
                    models.ForeignKey) and db_field.name in self.raw_id_fields:
                kwargs['widget'] = widgets.ForeignKeyRawIdWidget(db_field.rel)
            elif isinstance(
                    db_field,
                    models.ForeignKey) and db_field.name in self.radio_fields:
                kwargs['widget'] = widgets.AdminRadioSelect(attrs={
                    'class':
                    get_ul_class(self.radio_fields[db_field.name]),
                })
                kwargs['empty_label'] = db_field.blank and _('None') or None
            else:
                if isinstance(db_field, models.ManyToManyField):
                    # If it uses an intermediary model, don't show field in admin.
                    if db_field.rel.through is not None:
                        return None
                    elif db_field.name in self.raw_id_fields:
                        kwargs['widget'] = widgets.ManyToManyRawIdWidget(
                            db_field.rel)
                        kwargs['help_text'] = ''
                    elif db_field.name in (list(self.filter_vertical) +
                                           list(self.filter_horizontal)):
                        kwargs['widget'] = widgets.FilteredSelectMultiple(
                            db_field.verbose_name,
                            (db_field.name in self.filter_vertical))
            # Wrap the widget's render() method with a method that adds
            # extra HTML to the end of the rendered output.
            formfield = db_field.formfield(**kwargs)
            # Don't wrap raw_id fields. Their add function is in the popup window.
            if not db_field.name in self.raw_id_fields:
                # formfield can be None if it came from a OneToOneField with
                # parent_link=True
                if formfield is not None:
                    formfield.widget = widgets.RelatedFieldWidgetWrapper(
                        formfield.widget, db_field.rel, self.admin_site)
            return formfield

        # For any other type of field, just call its formfield() method.
        return db_field.formfield(**kwargs)
Exemplo n.º 23
0
    def formfield_for_dbfield(self, db_field, **kwargs):
        """
        Hook for specifying the form Field instance for a given database Field
        instance.

        If kwargs are given, they're passed to the form Field's constructor.
        """
        # For DateTimeFields, use a special field and widget.
        if isinstance(db_field, models.DateTimeField):
            kwargs['form_class'] = forms.SplitDateTimeField
            kwargs['widget'] = widgets.AdminSplitDateTime()
            return db_field.formfield(**kwargs)

        # For DateFields, add a custom CSS class.
        if isinstance(db_field, models.DateField):
            kwargs['widget'] = widgets.AdminDateWidget
            return db_field.formfield(**kwargs)

        # For TimeFields, add a custom CSS class.
        if isinstance(db_field, models.TimeField):
            kwargs['widget'] = widgets.AdminTimeWidget
            return db_field.formfield(**kwargs)

        # For FileFields and ImageFields add a link to the current file.
        if isinstance(db_field, models.ImageField) or isinstance(
                db_field, models.FileField):
            kwargs['widget'] = widgets.AdminFileWidget
            return db_field.formfield(**kwargs)

        # For ForeignKey or ManyToManyFields, use a special widget.
        if isinstance(db_field, (models.ForeignKey, models.ManyToManyField)):
            if isinstance(
                    db_field,
                    models.ForeignKey) and db_field.name in self.raw_id_fields:
                kwargs['widget'] = widgets.ForeignKeyRawIdWidget(db_field.rel)
            elif isinstance(
                    db_field,
                    models.ForeignKey) and db_field.name in self.radio_fields:
                kwargs['widget'] = widgets.AdminRadioSelect(attrs={
                    'class':
                    get_ul_class(self.radio_fields[db_field.name]),
                })
                kwargs['empty_label'] = db_field.blank and _('None') or None
            else:
                if isinstance(db_field, models.ManyToManyField):
                    if db_field.name in self.raw_id_fields:
                        kwargs['widget'] = widgets.ManyToManyRawIdWidget(
                            db_field.rel)
                        kwargs['help_text'] = ''
                    elif db_field.name in (list(self.filter_vertical) +
                                           list(self.filter_horizontal)):
                        kwargs['widget'] = widgets.FilteredSelectMultiple(
                            db_field.verbose_name,
                            (db_field.name in self.filter_vertical))
            # Wrap the widget's render() method with a method that adds
            # extra HTML to the end of the rendered output.
            formfield = db_field.formfield(**kwargs)
            # Don't wrap raw_id fields. Their add function is in the popup window.
            if not db_field.name in self.raw_id_fields:
                formfield.widget = widgets.RelatedFieldWidgetWrapper(
                    formfield.widget, db_field.rel, self.admin_site)
            return formfield

        if db_field.choices and db_field.name in self.radio_fields:
            kwargs['widget'] = widgets.AdminRadioSelect(
                choices=db_field.get_choices(include_blank=db_field.blank,
                                             blank_choice=[('', _('None'))]),
                attrs={
                    'class': get_ul_class(self.radio_fields[db_field.name]),
                })

        # For any other type of field, just call its formfield() method.
        return db_field.formfield(**kwargs)