cafelatte.here
cafelatte.here

Reputation: 3

Django's Generic UpdateView: How to pass value to the hidden form field?

I am trying to combine Django's generic UpdateView and hidden input field. My purpose is to track whether a post was edited after it was created or not. Hidden field name is "updated".

views.py:

class PostUpdateView(UpdateView):
  model = Post
  template_name = 'journal/post_update_form.html'
  form_class = PostUpdateForm
  success_url = reverse_lazy('my_posts')

models.py:

class Post(models.Model):
  title = models.CharField(max_length=500)
  text = models.TextField(max_length=2000, null=True, blank=True)
  owner = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True)
  #storing the link to media files in CharField
  image = models.CharField(max_length=500, null=True, blank=True)
  audio = models.CharField(max_length=500, null=True, blank=True)
  video = models.CharField(max_length=500, null=True, blank=True)
  rubric = models.CharField(max_length=100, default="No rubric", choices=RUBRIC_CHOICES)
  private = models.BooleanField(default=False)
  created_at = models.DateTimeField(auto_now_add=True)
  updated_at = models.DateTimeField(auto_now=True)
  updated = models.CharField(max_length=10, default="False")

forms.py:

from django import forms
from .models import Post

class PostUpdateForm(forms.ModelForm):
  class Meta:
    model = Post
    fields = ["title", "text", "image", "audio", "video", "rubric", "private", "updated"]
    widgets = {'updated': forms.HiddenInput(attrs={'value':"updated"})}

relevant part of update form template:

 <form action="" method="POST">
        {% csrf_token %}

        {% for field in form %}
          {% if field != form.rubric and field != form.private %}
            <div class="mb-3 form-group">
              <label for="{{field.name}}" class="form-label">{{field.label}}</label>
                {{field.errors}}
                {% if field == form.text %}
                  <textarea type="text" class="form-control" id="{{field.name}}" name="{{field.name}}">{{field.value|default_if_none:"" }}</textarea>
                {% elif field == form.updated %}
                  <input type="hidden" id="{{field.name}}" name="{{field.name}}" value="updated">
                {% else %}
                  <input type="text" class="form-control" id="{{field.name}}" name="{{field.name}}" value="{{field.value|default_if_none:"" }}">
                {% endif %}
            </div>

           <...some other fields...>
            {% endif %}
        {% endfor %}

        <input type="submit" class="btn btn-primary" value="Update"/>
      </form>

Value of "updated" field is passed successfully, but the field value is visible (non-editable). In forms.py I tried to:

[1] input field:

{% elif field == form.updated %}
                  <input type="hidden" id="{{field.name}}" name="{{field.name}}" value="updated">

I would appreciate any insights about what might be wrong here. Thank you in advance.

Upvotes: 0

Views: 223

Answers (1)

nznm
nznm

Reputation: 26

In PostUpdateForm you can do so:

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

    self.fields['updated'].initial = 'updated'
    self.fields['updated'].disabled = True

https://docs.djangoproject.com/en/4.1/ref/forms/fields/#disabled

Upvotes: 0

Related Questions