23

If the CreateView and UpdateView are using the same template "model_form.html" then within the template how would I differentiate if I am creating or updating a form?

My generic view is as follows

class AuthorCreateView(CreateView):
    form_class = AuthorForm
    model = Author


class AuthorUpdateView(UpdateView):
    form_class = AuthorForm
    model = Author

AuthorForm is as follows

class AuthorForm(ModelForm):
    class Meta:
        model = Author
        fields = ('first_name', 'last_name')

My template is as follows

<form action="" method="post">
            {% csrf_token %}
            <table border="0" cellpadding="4" cellspacing="0">
                <tr>
                    <td>First Name</td>
                    <td>{{ form.first_name.errors }}{{ form.first_name }}</td>
                </tr>
                <tr>
                    <td>Last Name</td>
                    <td>{{ form.last_name.errors }} {{ form.last_name }}</td>
                </tr>
            </table>
            {% if form.isNew %}
                <input type="submit" value="Update Author" />
            {% else %}
                <input type="submit" value="Add Author" />
            {% endif %}
        </form>

In my template I would like to differentiate between create and update view?

iJK
  • 4,655
  • 12
  • 63
  • 95

4 Answers4

34

In an update view, there'll be a form.instance, and form.instance.pk will not be None. In a create view, there may or may not be form.instance, but even if there is form.instance.pk will be None.

Daniel Roseman
  • 588,541
  • 66
  • 880
  • 895
31

From docs:

CreateView

object

When using CreateView you have access to self.object, which is the object being created. If the object hasn’t been created yet, the value will be None.

 

UpdateView

object

When using UpdateView you have access to self.object, which is the object being updated.

Solution:

{% if object %}
    <input type="submit" value="Update Author" />
{% else %}
    <input type="submit" value="Add Author" />
{% endif %}
2

add this function in your both CreateView and UpdateView class:

# For Create
def get_context_data(self, **kwargs):
        kwargs['naming'] = 'Create'
        context = super(CLASSNAME, self).get_context_data(**kwargs)
        return context

# For Update
def get_context_data(self, **kwargs):
        kwargs['naming'] = 'Update'
        context = super(CLASSNAME, self).get_context_data(**kwargs)
        return context

then reference those in your template with {{ naming }}

example

<button type="submit">{{ naming }}</button>
Rief
  • 371
  • 2
  • 10
1

the simplest way is to use template yesno filter as

{{ object|yesno:'Update Author,Create Author' }}

or in your case as the author is same word in both so

{{ object|yesno:'Update,Create' }} Author

object becomes yes if only there is an object instance and that would be the update view while it becomes no in create view.

Ali Aref
  • 1,893
  • 12
  • 31