Я пытаюсь найти решение для этого вопроса: Условно отобразить набор полей с хрустящими формами .
Однако я не могу завершить его из-за ошибки:
Метод запроса: 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
Спасибо за ваше время и усилия. Я одобряю это.