Как получить поля с галочкой в ​​django (Boolean Field) - PullRequest
0 голосов
/ 14 февраля 2020

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

 <form class="hero-menu">
                    {% for test in test %}
                    <div class="category-block">
                      <ul class="dropdown-list">
                        <li>
                          <a href="#"><h4 data-modal-target="menu-test-popup">
                              {{test.name|title}}
                            </h4></a>
                        </li>
                        {% for subtest in test.subtest.all %}
                        <!-- {% if subtest.test_id == test.id %}   -->
                           <li>
                            <div class="checkbox-group">
                              <input type="checkbox" id="aUniqueName" name={{subtest.name}}
                              value="example"/>
                              <label for="aUniqueName">
                               {{subtest.name|title}}
                              </label>
                            </div>
                          </li>
                          <!-- {% endif %}  -->
                        {% endfor %}


                      </ul>
                    </div>
                    {% endfor %}


                    <button class="button">Generate Report</button>
                  </form>

Это мои модели. В моих моделях у меня есть тест, который имеет внешний ключ в подтесте .

class Test(models.Model):
    name = models.CharField(max_length=100)
    def __str__(self):
        return self.name


class Subtest(models.Model):
    name = models.CharField(max_length=100)
    test = models.ForeignKey(Test,on_delete=models.CASCADE,related_name='subtest',blank=True, null=True)
    unit = models.CharField(max_length=10)
    reference_value = models.IntegerField()
    selected = models.BooleanField(default=False)
    def __str__(self):
        return self.name

Это мой взгляд. Я использовал template_context_processor для удобства.

def list_subtest(request):
return {'subtest':Subtest.objects.all(),'test':Test.objects.all().prefetch_related('subtest')}

1 Ответ

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

Прежде всего, я приглашаю вас перейти с FBV на CBV, поверьте мне, это положительно изменит все программирование в Django.

Я не вижу ваш пост-метод. Я оставлю вас здесь, как я это сделал:

[template.html]

<form action="" method="POST"> {% csrf_token %}
    {% for test in tests %}
        {% for subtest in subtests %}
            <input type="hidden" name="test_id" value="{{test.id}}">
            {% if test.id == subtest.test_id && subtest.selected %}
                <label>
                    <input type="checkbox" name="{{subtest.id}}" checked>{{subtest.name}}
                </label>
            {% else %}
                <label>
                    <input type="checkbox" name="{{subtest.id}}">{{subtest.name}}
                </label>
            {% endif %}
        {% endfor %}
    {% endfor %}
    ...

    <input class="btn btn-success" type="submit" value="GENERATE REPORT">
</form>

[views.py]

from .models import (
    Subtest,
    Test,
)
from django.views.generic import ListView

class ListSubsets(ListView):

    context_object_name = 'tests' # This replace context['tests']
    model = Test
    paginate_by = 1
    template_name = 'core/index.html'

    def get_context_data(self, **kwargs):
        context = super(ListSubsets, self).get_context_data(**kwargs)
        context['subtests'] = Subtest.objects.all()
        # context['tests'] = Test.objects.all() # Without prefetch_related
        return context

    def post(self, request):
        post_dict = request.POST.dict()
        # test = Test.objects.get(id = post_dict['test_id'])
        subtests = Subtest.objects.all()
        for subtest in subtests:
            try:
                if str(subtest.test_id) in post_dict:
                    update = Subtest.objects.get(test = subtest.test_id)
                    update.selected = True
                    update.save()
            except:
                print("Doesn't exist.")
        return self.get(request, *args, **kwargs)

Есть более тонкие способы сделать это, другие более эффективные способы, но действительно правильная вещь должна быть JavaScript. Проверьте угол, я приглашаю вас, и, пожалуйста, переключитесь на CBV.

------------------------------- - o --------------------------------

[settings.py]

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates/')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',

                # Our context processor for every app.
                # Core.
                'apps.functions.processor.cntxt_prcssr_templates_core',
           ],
        },
    },
]

[processor.py]

from .models import (
    Test,
    Subtest
)

# tests = Test.objects.all()
# subtests = Subtest.objects.all()

def cntxt_prcssr_templates_core(request=None):

    # TEST.
    'tests':       Test.objects.all(),
    # 'tests':       tests,

    # SUBTEST
    'subtests':    Subtest.objects.all(),
    # 'subtests':    subtests,

    return cntxt_templates_core

Тогда вы получаете доступ только к тестам или подтестам из любого шаблона. (html)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...