LINUX.ORG.RU

Синтаксис в Templates(необходимо добавить условие)

 ,


1

1

Подскажите, как правильно добавить условие:

{% if item.reg_price < 50 %} 
       {% price = item.reg_price + (item.reg_price/100*11,73)+ (item.reg_price/100*24,6) %} 
               <td>{{ price }}</td> 
{% elif 50 <= item.reg_price <= 500 %} 
       {% price = item.reg_price + (item.reg_price/100*12) + (item.reg_price/100*24,9) %} 
               <td>{{ price }}</td> 
{% elif item.reg_price < 500 %} 
       {% price = item.reg_price + (item.reg_price/100*11,75) + (item.reg_price/100*24,3) %} 
               <td>{{ price }}</td> 
{% endif %}

в templates:

{% elif target == 'reestr' %}
        <table class="table table-bordered table-condensed table" onselectstart="return false">
            <thead>
                <tr class="info">
                    <th class="text-center">Наименование</th>
                    <th class="text-center">Производитель</th>
                    <th class="text-center">Цена</th>
                </tr>
            </thead>
            <tbody>
                {% for item in item_list %}
                <tr class="active">
                    <td>{{ item.trade_name }}</td>
                    <td>{{ item.fabr_name}}</td>
                    <td>{{ item.reg_price }}</td> #здесь использовать условие
                </tr>
                {% endfor %}
            </tbody>
        </table>
        
Если заменить <td>{{ item.reg_price }}</td> условием, то начинают валиться ошибки.

Модель:

class TblReestr(models.Model):
    id = models.IntegerField(primary_key=True)  # AutoField?
    ean13 = models.CharField(max_length=50, blank=True, null=True)
    reg_price = models.DecimalField(max_digits=15, decimal_places=2, blank=True, null=True)
    trade_name = models.CharField(max_length=1000, blank=True, null=True)
    fabr_name = models.CharField(max_length=500, blank=True, null=True)
    reg_data = models.DateField(blank=True, null=True)
    mnn_name = models.CharField(max_length=250, blank=True, null=True)
    valuta_name = models.CharField(max_length=20, blank=True, null=True)
    num_prikaz = models.CharField(max_length=30, blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'tbl_reestr'

Views:

def search(request):
    q = request.GET['q']
    target = request.GET['target']
    title = request.GET['title']
    if target == 'brak':
        item_list = TblBrak.objects.filter(trade_name__icontains=q)
    elif target == 'reestr':
        item_list = TblReestr.objects.filter(trade_name__icontains=q)

Подскажите, как правильно в templates использовать такое условие.

Ох божечки.

Правильно было бы добавить метод к модели, который в зависимости от значения считал бы прайс. А шаблоне выводить только результат.

greek_31 ★★ ()

Зачем тебе это тормозное поделие. Возьми php7, там шаблонизатор в самом языке. Можно писать любые условия.

<? if(item->price > '50') { ?>
blabla
<? } else{ ?>
,...
<? } ?>
pawnhearts ★★★★★ ()
Ответ на: комментарий от pawnhearts

там шаблонизатор в самом языке

Или react. Там тоже

makoven ★★★★★ ()

Как правильно, тебе уже написали. Это в модели делать надо.
А что такое 11.73/24,6/… Шо за магия?

anonymous ()

Мне кажется как минимум с больше\меньше в условии напутано там где 500. Ну и когда вы внутри переменную определяете в jinja2 это делается со словом set ({% set foo = 'bar' %}), в джанге это не требуется?

Вы бы ошибки показали, кстати.

micronekodesu ★★ ()

Народ сколько будет в питоне 3 * 3,14
Это не стёб, так сколько?
Может до ТС'а дойдёт?

anonymous ()
Ответ на: комментарий от anonymous

Это коэффициент по которому сумма высчитывается. Мне сказали - так правильно. Вся эта приблуда на джанго, стоит в аптеке на терминале с тачскрином, чтоб клиенты могли наличие и цены на лекарства смотреть, не спрашивая на кассе. Это добро писал не я, меня попросили сумму вывода подправить. По идее тормознутости быть не должно из-за вычислений в html, т.к. в один момент может быть открыта только одна страница. И нагрузка там 3 клика в два часа.

PavelShturm ()
Ответ на: комментарий от pawnhearts

Попросили в готовом проекте подправить вывод цены с дисконтом. Переписывать все - желания нет, пока. Т.к. буду позже переписывать его на .NET core 2. А сейчас срочно попросили подправить,т.к. аптеку оштрафовали из-за неверной цены.

PavelShturm ()
Ответ на: комментарий от micronekodesu

Вы правы. В последнем условии больше 500, а не меньше. Т.е. если писать {% set price = ......%}, то ругаться на то,что переменная не определена перестанет?

PavelShturm ()
Ответ на: комментарий от micronekodesu

Ошибку завтра с утра выложу. А то удаленный доступ к терминалу,только из офиса есть.

PavelShturm ()
Ответ на: комментарий от PavelShturm

В джанго есть поддержка шаблонов jinja в них можно писать так как ты хочешь.

pawnhearts ★★★★★ ()
Ответ на: комментарий от greek_31

Если не трудно, то покажите как. Чтот я очкую модель править, т.к. поделка не моя - не хочу испортить. Человек,который писал - уволился давно. Точно знаю, что модель использует базу данных от другой программы. Т.е. она из нее только читать должна но ничего не записывать.

def current_price(self):
    if self.reg_price < 50:
        cur_price = self.reg_price + (self.reg_price/100*11,73)+ (self.reg_price/100*24,6)
    elif 50 <= self.reg_price <= 500:
        cur_price = self.reg_price + (self.reg_price/100*12) + (self.reg_price/100*24,9)
    elif self.reg_price > 500:
       cur_price =  self.reg_price + (self.reg_price/100*11,75) + (self.reg_price/100*24,3)
    return cur_price
Что-то типа такого? Как это за юзать в модели ,чтоб правильные значения выводил?

PavelShturm ()
Ответ на: комментарий от pawnhearts

Т.е. по сути ошибка в том, что я переменную без «set» объявил? Из-за это и ругался на то,что переменная price не объявлена?

{% if item.reg_price < 50 %} 
       {% set price = item.reg_price + (item.reg_price/100*11,73)+ (item.reg_price/100*24,6) %} 
               <td>{{ price }}</td> 
{% elif 50 <= item.reg_price <= 500 %} 
       {% set price = item.reg_price + (item.reg_price/100*12) + (item.reg_price/100*24,9) %} 
               <td>{{ price }}</td> 
{% elif item.reg_price > 500 %} 
       {% set price = item.reg_price + (item.reg_price/100*11,75) + (item.reg_price/100*24,3) %} 
               <td>{{ price }}</td> 
{% endif %}
Так будет правильно на jinja ?

PavelShturm ()
Ответ на: комментарий от PavelShturm

Я про магические числа.
И второе, запусти питон, перемножь 3 * 3,14, какой результат видишь?

anonymous ()
Ответ на: комментарий от anonymous

Если у тебя получится 9.42, попробуй ещё раз, только скопировав из коммента выше.

anonymous ()
Ответ на: комментарий от PavelShturm

Да, что-то типа такого. Раз уж бегло разбирать этот конкретно кусок кода.

Многое зависит от логики

Как я понимаю, это функция это типа наценка или что-то типа того. Все значения процентов перенести в settings.py(а не как у меня), что-бы можно было просто их менять

def current_price(self):
  if self.reg_price is None:
    pass  # твоя обработка нулевого значения, т.к. в модели это возможно
    return

  if self.reg_price < 50:
    surcharge = self.reg_price * 0.1173 + self.reg_price * 0.246
  elif 50 <= self.reg_price <= 500:
    surcharge = self.reg_price * 0.12 + self.reg_price * 0.249
  elif self.reg_price > 500:
    surcharge = self.reg_price * 0.1175 + self.reg_price * 0.243

  return self.reg_price + surcharge

Можно еще `@property' перед объявлением метода добавить.

greek_31 ★★ ()
Ответ на: комментарий от greek_31

Спасибо за совет! В html ,как потом обращаться?

<td>{{ current_price() }}</td>
Так?

PavelShturm ()
Ответ на: комментарий от greek_31

Или как то так:

class TblReestr(models.Model):
    id = models.IntegerField(primary_key=True)  
    ean13 = models.CharField(max_length=50, blank=True, null=True)
    reg_price = models.DecimalField(max_digits=15, decimal_places=2, blank=True, null=True)
    trade_name = models.CharField(max_length=1000, blank=True, null=True)
    fabr_name = models.CharField(max_length=500, blank=True, null=True)
    reg_data = models.DateField(blank=True, null=True)
    mnn_name = models.CharField(max_length=250, blank=True, null=True)
    valuta_name = models.CharField(max_length=20, blank=True, null=True)
    num_prikaz = models.CharField(max_length=30, blank=True, null=True)
    current_price = current_price() # так можно делать?
    
    class Meta:
        managed = False
        db_table = 'tbl_reestr'

    def current_price(self):
      if self.reg_price is None:
        pass  # твоя обработка нулевого значения, т.к. в модели это возможно
        return

      if self.reg_price < 50:
         surcharge = self.reg_price * 0.1173 + self.reg_price * 0.246
      elif 50 <= self.reg_price <= 500:
        surcharge = self.reg_price * 0.12 + self.reg_price * 0.249
      elif self.reg_price > 500:
        surcharge = self.reg_price * 0.1175 + self.reg_price * 0.243

      return self.reg_price + surcharge  

А потом:

{% elif target == 'reestr' %}
        <table class="table table-bordered table-condensed table" onselectstart="return false">
            <thead>
                <tr class="info">
                    <th class="text-center">Наименование</th>
                    <th class="text-center">Производитель</th>
                    <th class="text-center">Цена</th>
                </tr>
            </thead>
            <tbody>
                {% for item in item_list %}
                <tr class="active">
                    <td>{{ item.trade_name }}</td>
                    <td>{{ item.fabr_name}}</td>
                    <td>{{ item.current_price }}</td> #здесь использовать условие
                </tr>
                {% endfor %}
            </tbody>
        </table>

PavelShturm ()
Ответ на: комментарий от pawnhearts

Ошибка при попытке добавить условие в html:

TemplateSyntaxError at /search/

Invalid block tag on line 50: 'set', expected 'elif', 'else' or 'endif'. Did you forget to register or load this tag?

Request Method: 	GET
Request URL: 	http://127.0.0.1:8001/search/?q=%D0%B0%D1%86%D1%86&title=%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5+%D1%86%D0%B5%D0%BD%D1%8B+%3Cbr%3E+%D0%BD%D0%B0+%D0%BF%D1%80%D0%B5%D0%BF%D0%B0%D1%80%D0%B0%D1%82%D1%8B+%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B0+%D0%B6%D0%B8%D0%B7%D0%BD%D0%B5%D0%BD%D0%BD%D0%BE-%D0%BD%D0%B5%D0%BE%D0%B1%D1%85%D0%BE%D0%B4%D0%B8%D0%BC%D1%8B%D1%85+%3Cbr%3E+%D0%B8+%D0%B2%D0%B0%D0%B6%D0%BD%D0%B5%D0%B9%D1%88%D0%B8%D1%85+%D0%BB%D0%B5%D0%BA%D0%B0%D1%80%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85+%D0%BF%D1%80%D0%B5%D0%BF%D0%B0%D1%80%D0%B0%D1%82%D0%BE%D0%B2+%3Cbr%3E+%D0%BF%D0%BE+%D0%90%D1%81%D1%82%D1%80%D0%B0%D1%85%D0%B0%D0%BD%D1%81%D0%BA%D0%BE%D0%B9+%D0%BE%D0%B1%D0%BB%D0%B0%D1%81%D1%82%D0%B8&target=reestr
Django Version: 	1.10.7
Exception Type: 	TemplateSyntaxError
Exception Value: 	

Invalid block tag on line 50: 'set', expected 'elif', 'else' or 'endif'. Did you forget to register or load this tag?

Exception Location: 	/usr/local/lib/python2.7/dist-packages/django/template/base.py in parse, line 518
Python Executable: 	/usr/bin/python
Python Version: 	2.7.12
Python Path: 	

['/var/www/InfoTable',
 '/usr/lib/python2.7',
 '/usr/lib/python2.7/plat-i386-linux-gnu',
 '/usr/lib/python2.7/lib-tk',
 '/usr/lib/python2.7/lib-old',
 '/usr/lib/python2.7/lib-dynload',
 '/usr/local/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages']

Server time: 	Вт, 6 Мар 2018 03:32:58 -0600

Error during template rendering

In template /var/www/InfoTable/Info/templates/Info/search_results.html, error at line 50
Invalid block tag on line 50: 'set', expected 'elif', 'else' or 'endif'. Did you forget to register or load this tag?
40 	                    <th class="text-center">Производитель</th>
41 	                    <th class="text-center">Цена</th>
42 	                </tr>
43 	            </thead>
44 	            <tbody>
45 	                {% for item in item_list %}
46 	                <tr class="active">
47 	                    <td>{{ item.trade_name }}</td>
48 	                    <td>{{ item.fabr_name}}</td>
49 				{% if item.reg_price < 50 %} 
50 	                              {% set price = item.reg_price + item.reg_price * 0.1173+ item.reg_price*0.246 %} 
51 	                                   <td>{{ price }}</td> 
52 	                        {% elif 50 <= item.reg_price <= 500 %} 
53 	                              {% set price = item.reg_price + item.reg_price * 0.12 + item.reg_price * 0.249 %} 
54 	                                   <td>{{ price }}</td> 
55 	                        {% elif item.reg_price > 500 %} 
56 	                              {% set price = item.reg_price + item.reg_price * 0.1175 + item.reg_price * 0.243 %} 
57 	                                   <td>{{ price }}</td> 
58 	                        {% endif %}
59 	                    <td>{{ item.reg_price }}</td>
60 	                </tr>

PavelShturm ()
Ответ на: комментарий от PavelShturm
current_price = current_price() # так можно делать?

Так делать нельзя.

Можно так, результат будет такой, как ты хочешь.

 ...
 @property
 def current_price(self):
   ...

В остальном бегло ошибок не вижу больше...

Но судя по вопросам лучше нанять фрилансера

greek_31 ★★ ()
Последнее исправление: greek_31 (всего исправлений: 1)
Ответ на: комментарий от greek_31

Сделал, как Вы написали. Ошибок нет, но поле в html остается пустым. Может ли это быть из-за того ,что пытаюсь сложить reg_price, который DecimalField, и surcharge, который после всех вычислений будет float?

class TblReestr(models.Model):
    id = models.IntegerField(primary_key=True)  # AutoField?
    ean13 = models.CharField(max_length=50, blank=True, null=True)
    reg_price = models.DecimalField(max_digits=15, decimal_places=2, blank=True, null=True)
    trade_name = models.CharField(max_length=1000, blank=True, null=True)
    fabr_name = models.CharField(max_length=500, blank=True, null=True)
    reg_data = models.DateField(blank=True, null=True)
    mnn_name = models.CharField(max_length=250, blank=True, null=True)
    valuta_name = models.CharField(max_length=20, blank=True, null=True)
    num_prikaz = models.CharField(max_length=30, blank=True, null=True)


    @property
    def current_price(self):
        surcharge = 0
        if (self.reg_price is None) or (self.reg_price == 0):
            return surcharge

        if self.reg_price < 50:
            surcharge = self.reg_price * 0.1173 + self.reg_price * 0.246
        elif 50 <= self.reg_price <= 500:
            surcharge = self.reg_price * 0.12 + self.reg_price * 0.249
        elif self.reg_price > 500:
          surcharge = self.reg_price * 0.1175 + self.reg_price * 0.243

        return self.reg_price + surcharge
    

    class Meta:
        managed = False
        db_table = 'tbl_reestr'
{% for item in item_list %}
                <tr class="active">
                    <td>{{ item.trade_name }}</td>
                    <td>{{ item.fabr_name}}</td>
	            <td>{{ item.current_price }}</td> /* пустое */
		    <td>{{ item.reg_price }}</td> /* есть  значение */
                    
                </tr>
                {% endfor %}

PavelShturm ()
Ответ на: комментарий от greek_31

Пробую вот так:

@property
def current_price(self):
    return self.reg_price

<td>{{ item.current_price }}</td>

Но даже так цену не выводит на страницу.

Хотя <td>{{ item.reg_price }}</td> выводит.

PavelShturm ()

Миш, все фигня, давай по новой. Глаза потехкли...

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.