Функция Django функционирует некорректно

#python #django

#python #django

Вопрос:

В моей модели заказа у меня есть два поля Diagnosis_note и Internal_memo, если одно из полей пустое, я хочу отобразить красную кнопку и зеленую кнопку, если оба поля пусты. Однако в настоящее время в моей функции, если Diagnosis_note или оба поля пусты, отображается зеленая кнопка, а если поле Internal_memo пустое, отображается красная кнопка. Она должна отображать красную кнопку, если какая-либо из них пуста или не пуста, и зеленую, если обе пустые. Что-то не так с моей функцией is_complete, но я не могу понять, что.

 
class Order(models.Model):
    Diagnosis_note = models.CharField(max_length=30, blank=True)
    Internal_memo = models.CharField(max_length=100, blank=True)

    def is_complete(self):
        fields_list = [self.Diagnosis_note, self.Internal_memo]

        if self.Diagnosis_note or self.Internal_memo is None:
            return True
        else:
            return False


  
 html
{% if Order.is_complete %}

      <td><a href="{% url 'accounts:special-notes' Order.id %}" class="btn btn-danger" role="button"><i class="fas fa-check-circle"></i></a></td>

      {% else %}
      <td><a class="btn btn-success" role="button"><i class="far fa-circle"></i> </a></td>
        {% endif %}
  

Комментарии:

1. Я думаю, что в вашем состоянии существует неправильное понимание приоритета. self.Diagnosis_note or self.Internal_memo is None означает «Diagnosis_note считается истинным или Internal_memo равно None», а не «один из Diagnosis_note и Internal_memo равен None».

Ответ №1:

Вы сравниваете self.Internal_memo is None , но это может быть пустая строка (не None).

 def is_complete(self):
    return self.Diagnosis_note and self.Internal_memo  # returns True if both fields are not False and not empty. otherwise, it returns False
  

Ответ №2:

Вам нужно переписать оператор if-else в модели. То, что вы хотите, является зеленым только тогда, когда оба значения пусты, правильно? Красный, если какой-либо из них не является пустым или оба не являются пустыми. И из вашего html оба являются пустыми, затем возвращайте False, иначе True. Это заменит всю вашу инструкцию if else.

 return self.Diagnosis_note or self.Internal_memo
  

Комментарии:

1. должен ли я заменить возвращаемое значение true на это?

2. Замените весь ваш оператор if-else на это, предполагая, что вы хотите выполнить условия, перечисленные в моем ответе.

3. проблема в том, что он делает обратное. Она возвращает зеленый цвет, если оба поля не пусты, и красный, если оба поля пусты или одно из них пустое.

4. Извините, я исправил ответ.

5. Я хочу, чтобы функция возвращала красный цвет, если оба поля не пустые или одно из них не является пустым, и зеленый, если оба поля пустые.

Ответ №3:

Попробуйте изменить строку if self.Diagnosis_note or self.Internal_memo is None: на if self.Diagnosis_note == None or self.Internal_memo == None:

Тест для w = None и q = 1:

 [1]if q or w is None: print("Y")
>>> Y
[2] if w or q is None: print("Y")
>>>
[3] if w == None or q == None: print("Y")
>>> Y
  

Ответ №4:

Во-первых, вы имеете дело не с объектом, вместо этого вы вызываете класс. Сначала вы должны получить экземпляр, который вы ищете, например:

 order = Order.objects.get(id=order_id)
  

Затем передайте порядок в шаблон и выполните проверку.

Во-вторых, когда дело доходит до вашего условия if в методе is_complete(), это должно быть примерно так

 if not self.Diagnosis_note and not self.Internal_memo: return False
else: return True
  

Условия должны быть для обоих атрибутов и не использовать None, поскольку что, если значение равно «. оператор not обрабатывает как None, так и » в этом случае.

Комментарии:

1. Я заменил «if self. Diagnosis_note или self. Internal_memo равно None:»with», если не self. Diagnosis_note или нет self. Internal_memo:» , но теперь он возвращает зеленый, если оба поля не пустые, и красный, если оба поля пустые или одно из них пустое

2. Моя ошибка, это должно быть … если не self. Diagnosis_note, а не self. Internal_memo: возвращает False. Отредактировал ответ