В настоящее время я работаю над переводчиком ДНК в белок. Код работает неплохо. Однако я бы хотел улучшить его с помощью структуры сообщений в django: https : //docs.djangoproject.com/en/3.1/ref/contrib/messages/

Что я сделал, так это поместил три оператора if в функции, которые переводят и создают белок, так что, когда это утверждение истинно, оно вызывает сообщение. Однако при появлении сообщения появляются и другие сообщения messages.errors. Могу ли я как-нибудь распечатать нужное сообщение? Вот код views.py, в котором я ввожу операторы if:

class TranslatorView(View):
    def translate(self, request, phrase):
        translation = ""
        for letter in phrase:
            if letter.lower() in self.rna_mapper:
                translation += self.rna_mapper[letter.lower()].upper() if letter.isupper() else self.rna_mapper[letter]
            else: 
                translation = "INVALID DNA CHAIN"
           
        return translation

    
    def translate_amino(self, codon):
        return self.amino_mapper.get(codon, "")


   

    def build_protein(self, request, phrase):
        protein= []
        i = 0
        while i < len(phrase):
            codon = phrase[i: i + 3]
            amino = self.translate_amino(codon)
            if amino:
                protein.append(amino)
            else:
                messages.error(request, "PROTEIN WAS NOT FOUND")
            i += 3
        if len(phrase) % 3:
            messages.error(request, 'CHAIN MUST BE DIVISIBLE BY 3')
            return()
        else:
            return protein
    

А вот шаблон, в котором появляются сообщения:

{% extends "base.html"%}

{% block content%}

<div >
    
    <h2 class = "display-3">DNA TRANSLATED SUCCESFULLY </h2>
    <br>
    <br>
    <br>

  
    <h2>
        {{ translation }}
    </h2>


    <br>
    <br>
    <br>
   
    <h2 class = "display-4">YOUR PROTEIN IS</h2>

    <div class = "protein_image"></div>

    <br>
    <br>
    {% if messages %}
<ul class="messages">
    {% for message in messages %}
    <h2>{{ message }}</h2>
    {% endfor %}
</ul>
{% endif %}

    <h2>
        {{ protein }} 
    </h2>





    <button class= "button_with_image_save" value="Back" onclick="window.history.back()" ></button>


    
</div>   

{% endblock content%}

Разместив код, я считаю, что мне нужно что-то изменить в шаблоне, чтобы видеть одно сообщение вместо всех. Возможно индексация сообщений?

0
Marcgames_YT 5 Дек 2020 в 21:35

2 ответа

Лучший ответ

Мне кажется, вам следует выполнить % 3 - проверку, прежде чем начинать производство белка:

def build_protein(self, request, phrase):
    if len(phrase) % 3:
        messages.error(request, 'CHAIN MUST BE DIVISIBLE BY 3')
        return ()
    protein = []
    for i in range(0, len(phrase), 3):
        amino = self.translate_amino(phrase[i: i + 3])
        if not amino:
            messages.error(request, "PROTEIN WAS NOT FOUND")
            return ()  # you might stop the loop already
        protein.append(amino)
    return protein
0
schwobaseggl 5 Дек 2020 в 18:55

Из вашего описания сложно определить, чего именно вы пытаетесь достичь. Просматривая свой код, кажется, что вы вызываете build_protein () один раз, но в шаблоне / представлении появляются 3 (потенциально повторяющиеся) сообщения об ошибках - это правильно?

Если да, то вы хотели бы суммировать их, чтобы отображать только одно сообщение об ошибке для каждого вызова build_protein ()?

Для этого, вероятно, проще просто назначить флаг, указывающий, было ли выполнено условие ошибки в цикле, который объединяет несколько совпадений в одно логическое значение, как показано здесь:

def build_protein(self, request, phrase):
    protein= []
    protein_error = False
    i = 0
    while i < len(phrase):
        codon = phrase[i: i + 3]
        amino = self.translate_amino(codon)
        if amino:
            protein.append(amino)
        else:
            # Setting this on time or many has the same effect
            protein_error = True
        i += 3
    if len(phrase) % 3:
        # NOTE: Better to do this test (and return) *before* the while loop
        messages.error(request, 'CHAIN MUST BE DIVISIBLE BY 3')
        return()
    else:
        if protein_error:
            # This generates only a single error message if any issues encountered
            messages.error(request, "PROTEIN WAS NOT FOUND")
        return protein
0
GoGoWorx 5 Дек 2020 в 18:55