Как сделать поля доступными только для чтения в форме Django при соблюдении определенного условия c? - PullRequest
0 голосов
/ 14 января 2020

Основываясь на следующем изображении, я пытаюсь сделать категорию полей и текущие точки недоступными для редактирования, когда статус задачи Finalized или Cancelled, в противном случае поля должны быть редактируемыми.

enter image description here

Ниже приведен код из моего html файла.

{% extends "base.html" %} {% load widget_tweaks %} 
{% block content %}

<div id="form-group">
    <form method="POST" action="." enctype="multipart/form-data">
    {% csrf_token %}
    <label>Select your category</label>
        {{ form.category|add_class:"card" }}
    <label>What's the status of the task?</label>
        {{ form.status|add_class:"card" }}
    <label>Current points:</label>
        {{ form.points|add_class:"card" }}
    <label>Finalized date:</label>
        {{ form.ending_date|add_class:"card" }}
   <button type="submit" class="btn btn-success">Send</button>
   </form>
</div>

Ниже приведен код из моего forms.py файл.

class TaskModelForm(forms.ModelForm):
    class Meta:
        model= Task
        fields = ['category', 'status', 'points']

    def __init__(self, *args, **kwargs):
        super(TaskModelForm, self).__init__(*args, **kwargs)
        self.fields['status'].required = False
        self.fields['points'].required = False

Когда я хочу отредактировать содержимое этой формы, мне нужно проверить, является ли статус Завершенным, поэтому поля нельзя редактировать, в противном случае поля должны быть редактируемыми, и я что-то думаю about:

{% extends "base.html" %} {% load widget_tweaks %} 
{% block content %}

{% if form.status.value == 'Active' %} <!--make the fields editable -->
<div id="form-group">
    <form method="POST" action="." enctype="multipart/form-data">
    {% csrf_token %}
    <label>Select your category</label> 
        {{ form.category|add_class:"card" }} 
    ...
   <button type="submit" class="btn btn-success">Send</button>
   </form>
</div>
{% endif %}

{% if form.status.value == 'Finalized' %} <!--make the fields non-editable -->
<div id="form-group">
    <form method="POST" action="." enctype="multipart/form-data">
    {% csrf_token %}
    <label>Select your category</label> 
        {{ form.category|add_class:"card" }} 
   ...
   <button type="submit" class="btn btn-success">Send</button>
   </form>
</div>
{% endif %}

Тем не менее, я считаю, что мой подход может не сработать, потому что это может быть скорее проблема переднего плана, чем проблема заднего плана (просто предположение). Можете ли вы указать мне правильное направление для решения этой проблемы?

1 Ответ

1 голос
/ 14 января 2020

Поскольку статус выбирается пользователем, вы не можете выполнить свое требование, если на сервере запущен Python (Django). Вы должны обратиться к нему с помощью JavaScript, запущенного на веб-странице, которая отображает форму. Что-то вроде этого определенно поможет.

{% extends "base.html" %} {% load widget_tweaks %} 
{% block content %}

<body onload="makeReadOnly();">
  <div id="form-group">
    <form method="POST" action="." enctype="multipart/form-data">
    {% csrf_token %}
        <div class="tweet-composer">
          <label>Insert your task</label>
          {{ form.task|add_class:"card js-keeper-editor" }}
        </div>
         <label>Select your category</label>
          {{ form.category|add_class:"card" }}
        <label>Current points:</label>
          {{ form.points|add_class:"card" }}
        <button type="submit" class="btn btn-success">Send</button>
    </form>
 </div>
</body>
{% endblock content %}

<script type="text/javascript">
{% block jquery %}

 function makeReadOnly()
 {        
  if (document.getElementById('id_status').value == 'Finalized'){
      document.getElementById('id_task').readOnly=true;
      document.getElementById('id_category').readOnly=true;
 }else if (document.getElementById('id_status').value == 'Active'){ 
      document.getElementById('id_task').readOnly=true;
      document.getElementById('id_category').readOnly=false;
  }
 }
 document.getElementById('id_status').addEventListener('change', makeReadOnly);
{% endblock %}
</script>

С помощью «источника просмотра страницы» вы можете увидеть структуру HTML, которую Django генерирует из вашей формы, чтобы вы могли определить правильное биты с JQuery селекторами. В качестве альтернативы вы можете сделать

f = SomethingForm()
f.as_p()

в консоли ./manage.py shell.

В конце Django вам может потребоваться проверка пользовательской формы для обработки взаимозависимости между значением состояния и требуются ли другие поля или нет.

...