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)
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
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)
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))
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", )
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")
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
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> <strong>Linkin Park</strong>' % dict(admin_static_prefix(), bandpk=band.pk))
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" /> <strong>Honeycomb object</strong>' % {'hcombpk': big_honeycomb.pk})
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" /> <strong>Individual object</strong>' % {'subj1pk': subject1.pk})
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)
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> <strong>Hidden</strong>' % admin_static_prefix())
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)
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> <strong>Apple</strong>' % admin_static_prefix())
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>' ' <strong>Linkin Park</strong>' ) % {'bandpk': band.pk} )
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)
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> <strong>Apple</strong>' ) )
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> <strong>Hidden</strong>' ) )
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)
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
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)
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)
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)