Model field and form field¶
GalleryField¶
- class galleryfield.fields.GalleryField(target_model=None, *args, **kwargs)[source]¶
Bases:
django.db.models.fields.json.JSONFieldThis is a model field which saves the id of images.
- Parameters
target_model (str, optional.) – A string in the form of
"app_label.model_name", which can be loaded bydjango.apps.get_model()(see Django docs), defaults to None. If None,galleryfield.BuiltInGalleryImagewill be used. If set, it should be a valid image model.
GalleryField and GalleryImages¶
When you access a GalleryField on a model, you are
given an instance of GalleryImages as a proxy for accessing the
underlying images. Basically, a GalleryImages instance
is a list of pk of the image model instances defined by
target_model. That means we can manipulate the field value with
method such as slice, append() and extend().
For example:
>>> g = Demogallery.objects.first()
>>> g.images
[2, 1, 3]
>>> len(g.images)
3
>>> g.images.append(4) # assuming there is BuiltInGalleryImage with pk=4
>>> g.save()
>>> g.images
>>> [2, 1, 3, 4]
Besides that, GalleryField includes an objects attribute:
- GalleryImages.objects¶
An queryset of image instances.
That means we can do chained query to the attribute. Sample usage:
>>> g.images.objects.all()
<QuerySet [<BuiltInGalleryImage: BuiltInGalleryImage object (2)>, <BuiltInGalleryImage:
BuiltInGalleryImage object (1)>, <BuiltInGalleryImage: BuiltInGalleryImage object (3)>,
<BuiltInGalleryImage: BuiltInGalleryImage object (4)>]>
>>> g.images.objects.filter(pk__lte=2)
<QuerySet [<BuiltInGalleryImage: BuiltInGalleryImage object (2)>, <BuiltInGalleryImage:
BuiltInGalleryImage object (1)>]>
>>> g.images.objects.filter(pk__gte=5)
<QuerySet []>
With the objects attribute, it’s also handy to render images
contained in the field. For example, we use code like to the following snippet
in the template which renders detailed view of demo.models.DemoGallery
instances:
{% for obj in object.images.objects.all %}
<a href="{{ obj.image.url }}">
</a>
{% endfor %}
where object is an instance of demo.models.DemoGallery.
GalleryFormField¶
- class galleryfield.fields.GalleryFormField(max_number_of_images=None, **kwargs)[source]¶
Bases:
django.forms.fields.JSONFieldThe default formfield for
galleryfield.fields.GalleryField.- Parameters
max_number_of_images (int, optional.) – Max allowed number of images, defaults to None, which means unlimited.
kwargs –
Besides the options from parent class, the following were added:
target_model: str, a valid target image model which can be loaded by
apps.get_model. When this field is used in the model form, it is auto configured by the model instance.However, if this field is used as a non-model form field, when not specified, it will use the built-in default target image model
galleryfield.BuiltInGalleryImage.widget: if not specified, defaults to
GalleryWidgetwith default values.
Note
If target_model not specified when initializing, an info will be logged to the stdout, which can be turned off by adding
gallery_form_field.I001insettings.SILENCED_SYSTEM_CHECKS.
Note
galleryfield.fields.GalleryFormField is not supposed to be used independently
(i.e., as a non-modelform field). The most possible cases for us to access the formfield are
in the modelform configurations. For example:
class MyGalleryForm(forms.ModelForm): class Meta: model = MyGallery fields = ["images"] def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields["images"].required = False self.fields["images"].max_number_of_images = 2 # from django.forms.widgets import Textarea # self.fields["images"].widget = Textarea() # Use Textarea as widget
Warning
If you want to use galleryfield.fields.GalleryFormField as a non-modelform
field, remember to initialize the
field with a key word argument like target_model="my_app.MyImage", otherwise it will use
galleryfield.BuiltInGalleryImage as the target_model. Also, keep in mind that
the cleaned_data of the field only contains the pk of the image model instances.