Forms — django-richtemplates v0.3.4 documentation

### Navigation

- index
- modules |
- next |
- previous |
- django-richtemplates v0.3.4 documentation »

# Forms

django-richtemplates comes with some custom forms which are designed to be reusable and easily extensible. Here is a list of available forms:

- LimitingModelForm

## LimitingModelForm

This form allow us to choose a field on which other fields within same form would rely on when it comes to make a query.

### Example

Concept of this form is simple but let us start with some basics. Let’s assume we have one model which is heart of our scheme, and we have also 3 other models which are related to the first one:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    class Project(models.Model):
        name = models.CharField(max_length=32)
        is_public = models.BooleanField(default=True)
        created_at = models.DateTimeField(auto_now_add=True)
        created_by = models.ForeignKey(User)

    class Task(models.Model):
        summary = models.CharField(max_length=64)
        content = models.TextField()
        project = models.ForeignKey(Project)
        status = models.ForeignKey('Status')
        priority = models.ForeignKey('Priority')
        created_at = models.DateTimeField(auto_now_add=True)
        author = models.ForeignKey(User)
        edited_at = models.DateTimeField(auto_now=True)
        editor = models.ForeignKey(User)

    class Status(models.Model):
        name = models.CharField(max_length=16)
        project = models.ForeignKey(Project)

    class Priority(models.Model):
        name = models.CharField(max_length=16)
        project = models.ForeignKey(Project)

Our object here is to create a form for the `Task`. We defined foreign key to the project table as we want to be able to specify other statuses and priorities for different projects. Normally we would create a form like this:

    1
    2
    3
    class TaskForm(forms.ModelForm):
        class Meta:
            model = Task

But with this approach our form would give us ability to choose status and priority from all possible objects, related to each project. So we need to override `status` and `priority` fields or create some factory method which would return us a TaskForm with `status` and `priority` fields limited to the previously chosen `project`. And what if we would have to make more such form classes? We do not want to break DRY rule, are we? Sure we don’t and `LimitingModelForm` is here for us! To make one we would simply add `choices_limiting_fields` option to our form’s `Meta` subclass:

    1
    2
    3
    4
    5
    from richtemplates.forms import LimitingModelForm

    class TaskForm(LimitingModelForm):
        class Meta:
            choices_limiting_fields = ['project']

`LimitingModelForm` directly extends `django.forms.ModelForm` class and at the time of initialization, after normal `django.forms.ModelForm.__init__` logic it simply calls a method which limits already created fields with foreign key to the model we specify in `choices_limiting_fields` iterable.

Note

This is still somewhat experimental and overall implementation should be improved.

Note

Do not use this form in admin! It would work perfectly fine for existing `Task` objects but if you’d try to create new one from admin a `LimitingModelFormError` would be risen as `LimitingModelForm` requires that field specified in `chocies_limiting_fields` option is already set on the object. This should be fixed though.

### Navigation

- index
- modules |
- next |
- previous |
- django-richtemplates v0.3.4 documentation »