Условно отображать с помощью Crispy Forms - объект ошибки 'tuple' не имеет атрибута 'get' - PullRequest
0 голосов
/ 26 июня 2019

Я пытаюсь найти решение для этого вопроса: Условно отобразить набор полей с хрустящими формами .

Однако я не могу завершить его из-за ошибки: Метод запроса: GET URL запроса: http://127.0.0.1:8000/project/customer/ Джанго версия: 2.2.2 Тип исключения: AttributeError Значение исключения:

Объект 'tuple' не имеет атрибута 'get'

model.py:

class Project(models.Model):
    project_name = models.CharField(max_length=50, primary_key=True)
    # who owns the project?
    owner = models.ForeignKey(User, on_delete=models.PROTECT)
    created_date = models.DateTimeField(auto_now=False, auto_now_add=True)
    is_active = models.BooleanField(default=True)
    ## when on call starts 5 pm?
    on_call_begings = models.TimeField(auto_now=False, auto_now_add=False, default=datetime.time(17, 00))
    ## when on call ends 9 am?
    on_call_ends = models.TimeField(auto_now=False, auto_now_add=False, default=datetime.time(9, 00))
    country = CountryField()
    follow_holidays = models.BooleanField(default=True)
    slug = models.SlugField()


    class Meta:
        verbose_name = "Project"
        verbose_name_plural = "Projects"

    def __str__(self):
        return self.project_name

    def get_absolute_url(self):
        return reverse("Project_detail", kwargs={"slug": self.slug})

Forms.py

from django import forms
from core.models import Project
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Fieldset, Field, Layout

class ProjectForm(forms.ModelForm):
    class Meta:
        model = Project
        fields = ("project_name", "is_active", "on_call_ends", "on_call_begings", 'country', 'follow_holidays')

    def __init__(self, *args, **kwargs):
        super(ProjectForm, self).__init__(args, kwargs)
        self.username = kwargs.pop('user', None)
        self.helper = FormHelper(self)
        self.helper.attrs = {'novalidate': ''}
        self.helper.layout = Layout(
            Fieldset("project_name", "is_active", "on_call_ends", "on_call_begings", 'country', 'follow_holidays')
        )
        if self.username and self.username.is_staff:
            self.helper.layout.append(Fieldset(
                'owner',
        )
    )

Проблема есть. Когда я удаляю метод init, он работает нормально.

view.py

def addProject(request):
    '''
    The view manages Customer's project and its settings
    '''
    print('test')
    if request.method == 'POST':
        project_form = ProjectForm(request.POST, 
                        instance=Project(), 
                        prefix="project"
                        )
        if project_form.is_valid():
            project = project_form.save(commit=False)
            # project.owner = request.user
            project.save()
            return redirect("home")

    else:
        project_form = ProjectForm(request.POST, user=getattr(request, 'user', None))
        # settings_form = ProjectSettingsForm(instance=ProjectSettings(), prefix="settings")

    return render(request, 'project.html', {
        'form': project_form
    })

HTML:

{% load crispy_forms_tags %}

{% block content %}
<div class="container">
    <div class="row justify-content-center mt-2">
        <div id="demo" class="collapse show pl-3">
            <form method="post" novalidate>
                <div class="card card-body bg-light">
                <h4 class="text-center">{% if title %} {{ title }} {% else %} Add new account {% endif %} </h4>
                <hr>
                <div>
                  {% csrf_token %}
                  {{ form|crispy }}
                </div>
                <br>
                <button type="submit" class="btn btn-primary mt-2">
                    <span class="glyphicon glyphicon-search"></span> Save
                </button>
                </div>
            </form>
    </div>
  </div>
</div>

{% endblock %}

Обновление запрошено:

urls.py

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', IndexView.as_view(), name='home'),
    path('add_overtime', addOvertime, name='add_overtime'),
    path('add_project', addProject, name='add_project'),
    path('myprojects', MyProjects.as_view(), name='myprojects'),
    path('update_project/<slug:slug>/', ProjectUpdateView.as_view(), name='update_project'),
    path('search/', search, name='search'),
    path('login/', auth_views.LoginView.as_view(template_name='login.html'), name='login'),
    path('users/', include('django.contrib.auth.urls')),

]

стек ошибок:

System check identified no issues (0 silenced).
June 26, 2019 - 16:49:56
Django version 2.2.2, using settings 'demo.settings.development'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
Internal Server Error: /add_project
Traceback (most recent call last):
  File "C:\Users\ms250176\Documents\Django\teradata-overtimes-2\env\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "C:\Users\ms250176\Documents\Django\teradata-overtimes-2\env\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Users\ms250176\Documents\Django\teradata-overtimes-2\env\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\ms250176\Documents\Django\teradata-overtimes-2\core\views.py", line 260, in addProject
    'form': project_form
  File "C:\Users\ms250176\Documents\Django\teradata-overtimes-2\env\lib\site-packages\django\shortcuts.py", line 36, in render
    content = loader.render_to_string(template_name, context, request, using=using)
  File "C:\Users\ms250176\Documents\Django\teradata-overtimes-2\env\lib\site-packages\django\template\loader.py", line 62, in render_to_string
    return template.render(context, request)
  File "C:\Users\ms250176\Documents\Django\teradata-overtimes-2\env\lib\site-packages\django\template\backends\django.py", line 61, in render
    return self.template.render(context)
  File "C:\Users\ms250176\Documents\Django\teradata-overtimes-2\env\lib\site-packages\django\template\base.py", line 171, in render
    return self._render(context)
  File "C:\Users\ms250176\Documents\Django\teradata-overtimes-2\env\lib\site-packages\django\test\utils.py", line 96, in instrumented_test_render
    return self.nodelist.render(context)
  File "C:\Users\ms250176\Documents\Django\teradata-overtimes-2\env\lib\site-packages\django\template\base.py", line 937, in render
    bit = node.render_annotated(context)
  File "C:\Users\ms250176\Documents\Django\teradata-overtimes-2\env\lib\site-packages\django\template\base.py", line 904, in render_annotated
    return self.render(context)
  File "C:\Users\ms250176\Documents\Django\teradata-overtimes-2\env\lib\site-packages\django\template\loader_tags.py", line 150, in render
    return compiled_parent._render(context)
  File "C:\Users\ms250176\Documents\Django\teradata-overtimes-2\env\lib\site-packages\django\test\utils.py", line 96, in instrumented_test_render
    return self.nodelist.render(context)
  File "C:\Users\ms250176\Documents\Django\teradata-overtimes-2\env\lib\site-packages\django\template\base.py", line 937, in render
    bit = node.render_annotated(context)
  File "C:\Users\ms250176\Documents\Django\teradata-overtimes-2\env\lib\site-packages\django\template\base.py", line 904, in render_annotated
    return self.render(context)
  File "C:\Users\ms250176\Documents\Django\teradata-overtimes-2\env\lib\site-packages\django\template\loader_tags.py", line 62, in render
    result = block.nodelist.render(context)
  File "C:\Users\ms250176\Documents\Django\teradata-overtimes-2\env\lib\site-packages\django\template\base.py", line 937, in render
    bit = node.render_annotated(context)
  File "C:\Users\ms250176\Documents\Django\teradata-overtimes-2\env\lib\site-packages\django\template\base.py", line 904, in render_annotated
    return self.render(context)
  File "C:\Users\ms250176\Documents\Django\teradata-overtimes-2\env\lib\site-packages\django\template\base.py", line 987, in render
    output = self.filter_expression.resolve(context)
  File "C:\Users\ms250176\Documents\Django\teradata-overtimes-2\env\lib\site-packages\django\template\base.py", line 698, in resolve
    new_obj = func(obj, *arg_vals)
  File "C:\Users\ms250176\Documents\Django\teradata-overtimes-2\env\lib\site-packages\crispy_forms\templatetags\crispy_forms_filters.py", line 66, in as_crispy_form
    return template.render(c)
  File "C:\Users\ms250176\Documents\Django\teradata-overtimes-2\env\lib\site-packages\django\template\backends\django.py", line 61, in render
    return self.template.render(context)
  File "C:\Users\ms250176\Documents\Django\teradata-overtimes-2\env\lib\site-packages\django\template\base.py", line 171, in render
    return self._render(context)
  File "C:\Users\ms250176\Documents\Django\teradata-overtimes-2\env\lib\site-packages\django\test\utils.py", line 96, in instrumented_test_render
    return self.nodelist.render(context)
  File "C:\Users\ms250176\Documents\Django\teradata-overtimes-2\env\lib\site-packages\django\template\base.py", line 937, in render
    bit = node.render_annotated(context)
  File "C:\Users\ms250176\Documents\Django\teradata-overtimes-2\env\lib\site-packages\django\template\base.py", line 904, in render_annotated
    return self.render(context)
  File "C:\Users\ms250176\Documents\Django\teradata-overtimes-2\env\lib\site-packages\crispy_forms\templatetags\crispy_forms_utils.py", line 34, in render
    return remove_spaces(self.nodelist.render(context).strip())
  File "C:\Users\ms250176\Documents\Django\teradata-overtimes-2\env\lib\site-packages\django\template\base.py", line 937, in render
    bit = node.render_annotated(context)
  File "C:\Users\ms250176\Documents\Django\teradata-overtimes-2\env\lib\site-packages\django\template\base.py", line 904, in render_annotated
    return self.render(context)
  File "C:\Users\ms250176\Documents\Django\teradata-overtimes-2\env\lib\site-packages\django\template\defaulttags.py", line 309, in render
    return nodelist.render(context)
  File "C:\Users\ms250176\Documents\Django\teradata-overtimes-2\env\lib\site-packages\django\template\base.py", line 937, in render
    bit = node.render_annotated(context)
  File "C:\Users\ms250176\Documents\Django\teradata-overtimes-2\env\lib\site-packages\django\template\base.py", line 904, in render_annotated
    return self.render(context)
  File "C:\Users\ms250176\Documents\Django\teradata-overtimes-2\env\lib\site-packages\django\template\loader_tags.py", line 188, in render
    return template.render(context)
  File "C:\Users\ms250176\Documents\Django\teradata-overtimes-2\env\lib\site-packages\django\template\base.py", line 173, in render
    return self._render(context)
  File "C:\Users\ms250176\Documents\Django\teradata-overtimes-2\env\lib\site-packages\django\test\utils.py", line 96, in instrumented_test_render
    return self.nodelist.render(context)
  File "C:\Users\ms250176\Documents\Django\teradata-overtimes-2\env\lib\site-packages\django\template\base.py", line 937, in render
    bit = node.render_annotated(context)
  File "C:\Users\ms250176\Documents\Django\teradata-overtimes-2\env\lib\site-packages\django\template\base.py", line 904, in render_annotated
    return self.render(context)
  File "C:\Users\ms250176\Documents\Django\teradata-overtimes-2\env\lib\site-packages\django\template\defaulttags.py", line 302, in render
    match = condition.eval(context)
  File "C:\Users\ms250176\Documents\Django\teradata-overtimes-2\env\lib\site-packages\django\template\defaulttags.py", line 876, in eval
    return self.value.resolve(context, ignore_failures=True)
  File "C:\Users\ms250176\Documents\Django\teradata-overtimes-2\env\lib\site-packages\django\template\base.py", line 671, in resolve
    obj = self.var.resolve(context)
  File "C:\Users\ms250176\Documents\Django\teradata-overtimes-2\env\lib\site-packages\django\template\base.py", line 796, in resolve
    value = self._resolve_lookup(context)
  File "C:\Users\ms250176\Documents\Django\teradata-overtimes-2\env\lib\site-packages\django\template\base.py", line 858, in _resolve_lookup
    current = current()
  File "C:\Users\ms250176\Documents\Django\teradata-overtimes-2\env\lib\site-packages\django\forms\forms.py", line 313, in non_field_errors
    return self.errors.get(NON_FIELD_ERRORS, self.error_class(error_class='nonfield'))
  File "C:\Users\ms250176\Documents\Django\teradata-overtimes-2\env\lib\site-packages\django\forms\forms.py", line 180, in errors
    self.full_clean()
  File "C:\Users\ms250176\Documents\Django\teradata-overtimes-2\env\lib\site-packages\django\forms\forms.py", line 381, in full_clean
    self._clean_fields()
  File "C:\Users\ms250176\Documents\Django\teradata-overtimes-2\env\lib\site-packages\django\forms\forms.py", line 393, in _clean_fields
    value = field.widget.value_from_datadict(self.data, self.files, self.add_prefix(name))
  File "C:\Users\ms250176\Documents\Django\teradata-overtimes-2\env\lib\site-packages\django\forms\widgets.py", line 258, in value_from_datadict
    return data.get(name)
AttributeError: 'tuple' object has no attribute 'get'
[26/Jun/2019 16:49:57] "GET /add_project HTTP/1.1" 500 273038

Спасибо за ваше время и усилия. Я одобряю это.

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