Я пытаюсь создать редактируемую страницу справки для пользователей на моем сайте, используя Django v1.11 и Trumbowyg.Я пытаюсь сделать следующее:
- Только разрешение суперпользователю редактировать страницу с помощью видимой им кнопки
- Использование редактора Trumbowyg для ввода и редактирования текста
- Сохранение этого текста и последующее отображение его в виде html на странице
Естественно, я подумал, что мне следует создать модель для HelpText, которая будет содержать текст, помещенный в редактор Trumbowyg.Однако эта модель должна быть особенной в том смысле, что может быть только одна из них.Поэтому я обратился к модели Singleton.Я следовал этому учебнику и создал модель SingletonModel и разделил ее на подклассы для моей модели HelpText следующим образом.
class SingletonModel(models.Model):
class Meta:
abstract = True
def save(self, *args, **kwargs):
self.pk = 1
super(HelpText, self).save(*args, **kwargs)
def delete(self, *args, **kwargs):
pass
@classmethod
def load(cls):
obj, created = cls.objects.get_or_create(pk=1)
return obj
class HelpText(SingletonModel):
text = models.TextField(blank=True)
Однако после регистрации HelpText в моем admin.py это дало мне ошибку.
the model s is abstract so it cannot be registered with admin.' model.__name__
По результатам нескольких поисков в Google я обнаружил, что проблема заключалась в том, что в классе Meta abstract установлено значение true.Я не мог понять, как избавиться от этой ошибки, поэтому вместо этого я подумал: «Эй! Если проблема в том, что abstract установлен в true, тогда давайте полностью обнуляем класс SingletonModel и просто помещаем его методы в HelpText».И тогда я сделал это.
class HelpText(models.Model):
text = models.TextField(blank=True)
def save(self, *args, **kwargs):
self.pk = 1
super(HelpText, self).save(*args, **kwargs)
def delete(self, *args, **kwargs):
pass
@classmethod
def load(cls):
obj, created = cls.objects.get_or_create(pk=1)
return obj
def __str__(self):
return self.help_text
Удивительно, но я тоже получил ошибку, но более жесткой.Теперь, когда я загружаю свою справочную страницу, Джанго говорит мне, что «имя« я »не определено».Я понятия не имею, как это возможно, учитывая, что у меня есть несколько других моделей, которые используют def__str __ (self) для определения своих строковых методов и явно используют self для ссылки на свои собственные поля.Как это происходит?Ошибка также возникает в методе help_landing в views.py в строке help_text = webapp_models.HelpText.load()
.Представления и шаблоны, относящиеся к этой модели, приведены ниже.
views.py
@login_required(login_url=LEADER_LOGIN_URL)
def help_landing(request):
# Variable to decide if the edit button exists on the help_landing page
super_can_edit = is_superuser(request.user)
help_text = webapp_models.HelpText.load()
context = {
'include_back': True,
'include_home': True,
'description': 'Help',
'super_can_edit': super_can_edit,
'help_text': help_text,
}
return render(request, 'leader/help_landing.html', context)
@login_required(login_url=LEADER_LOGIN_URL)
def help_create_landing(request):
help_text = webapp_models.HelpText.load()
context = {
'include_back': True,
'include_home': True,
'description': 'Help Edit',
'help_text': help_text,
}
return render(request, 'leader/help_create_landing', context)
@login_required(login_url=LEADER_LOGIN_URL)
def help_create(request):
help_text = webapp_models.HelpText.load()
help_text.update(
text=request.POST['text'],
)
help_text.save()
return redirect('leader/help_landing')
help_landing.html
{% extends "leader/base.html" %}
{% block extra_css %}
<style>
button {
background-color: Transparent;
background-repeat: no-repeat;
border: none;
cursor: pointer;
overflow: hidden;
outline: none;
}
</style>
{% endblock %}
{% block description %}{{ description }}{% endblock %}
{% block content %}
<div class="ui grid">
<div class="eight wide column">
{% if help_text %}{{ help_text.text }}{% endif %}
</div>
{% if super_can_edit %}
<div class="six wide column">
<a href="leader/help_create_landing/">
<button class="customButton" type="submit">
<h2 class="ui header">
<i class="big circle add icon"></i>
Edit Help Page
</h2>
</button>
</a>
</div>
{% endif %}
</div>
{% block javascript %}
<script>
</script>
{% endblock %}
help_create_landing.html
{% extends "leader/base.html" %}
{% block extra_css %}
<style>
button {
background-color: Transparent;
background-repeat: no-repeat;
border: none;
cursor: pointer;
overflow: hidden;
outline: none;
}
</style>
{% endblock %}
{% block description %}{{ description }}{% endblock %}
{% block content %}
<div class="column">
<form name="helpForm" action="/leader/help_create/" method="post" role="form" enctype="multipart/form-data">{% csrf_token %}
<div class="ui grid">
<div class="six wide column">
<textarea id="helpEditor" name="text" rows=6 type="text">
{% if help_text %}{{ help_text.text }}{% endif %}
</textarea>
</div>
<div class="six wide column">
<button type="submit" id="save">Edit</button>
</div>
</div>
</form>
</div>
{% block javascript %}
<script>
$(helpEditor).trumbowyg();
</script>
{% endblock %}
Traceback: я переключаю имя веб-сайта по соображениям безопасности
Environment:
Request Method: GET
Request URL: https://fdev.com/leader/help_landing/
Django Version: 1.11.4
Python Version: 3.5.2
Installed Applications:
['webapp.apps.WebappConfig',
'leader.apps.LeaderConfig',
'rest_framework',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'channels']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware']
Traceback:
File "/home/felix/felix_env/lib/python3.5/site-packages/django/core/handlers/exception.py" in inner
41. response = get_response(request)
File "/home/felix/felix_env/lib/python3.5/site-packages/django/core/handlers/base.py" in _get_response
187. response = self.process_exception_by_middleware(e, request)
File "/home/felix/felix_env/lib/python3.5/site-packages/channels/handler.py" in process_exception_by_middleware
243. return super(AsgiHandler, self).process_exception_by_middleware(exception, request)
File "/home/felix/felix_env/lib/python3.5/site-packages/django/core/handlers/base.py" in _get_response
185. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/felix/felix_env/lib/python3.5/site-packages/django/contrib/auth/decorators.py" in _wrapped_view
23. return view_func(request, *args, **kwargs)
File "/home/felix/felixserver/leader/views.py" in help_landing
1892. help_text = webapp_models.HelpText.load()
File "/home/felix/felixserver/webapp/models.py" in load
Exception Type: NameError at /leader/help_landing/
Exception Value: name 'self' is not defined
Когда в оболочке Django я могу создать экземпляр объекта HelpText, но если я создаю более одного, я получаю сообщение об ошибке.Я считаю, что это потому, что я убедился, что всегда должна существовать одна модель HelpText.Вот трассировка.
Traceback (most recent call last):
File "/home/felix/felix_env/lib/python3.5/site-packages/django/db/backends/utils.py", line 65, in execute
return self.cursor.execute(sql, params)
File "/home/felix/felix_env/lib/python3.5/site-packages/django/db/backends/sqlite3/base.py", line 328, in execute
return Database.Cursor.execute(self, query, params)
sqlite3.IntegrityError: UNIQUE constraint failed: webapp_helptext.id
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/home/felix/felix_env/lib/python3.5/site-packages/django/db/models/manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/home/felix/felix_env/lib/python3.5/site-packages/django/db/models/query.py", line 394, in create
obj.save(force_insert=True, using=self.db)
File "/home/felix/felixserver/webapp/models.py", line 371, in save
super(HelpText, self).save(*args, **kwargs)
File "/home/felix/felix_env/lib/python3.5/site-packages/django/db/models/base.py", line 807, in save
force_update=force_update, update_fields=update_fields)
File "/home/felix/felix_env/lib/python3.5/site-packages/django/db/models/base.py", line 837, in save_base
updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
File "/home/felix/felix_env/lib/python3.5/site-packages/django/db/models/base.py", line 923, in _save_table
result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)
File "/home/felix/felix_env/lib/python3.5/site-packages/django/db/models/base.py", line 962, in _do_insert
using=using, raw=raw)
File "/home/felix/felix_env/lib/python3.5/site-packages/django/db/models/manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/home/felix/felix_env/lib/python3.5/site-packages/django/db/models/query.py", line 1076, in _insert
return query.get_compiler(using=using).execute_sql(return_id)
File "/home/felix/felix_env/lib/python3.5/site-packages/django/db/models/sql/compiler.py", line 1107, in execute_sql
cursor.execute(sql, params)
File "/home/felix/felix_env/lib/python3.5/site-packages/django/db/backends/utils.py", line 80, in execute
return super(CursorDebugWrapper, self).execute(sql, params)
File "/home/felix/felix_env/lib/python3.5/site-packages/django/db/backends/utils.py", line 65, in execute
return self.cursor.execute(sql, params)
File "/home/felix/felix_env/lib/python3.5/site-packages/django/db/utils.py", line 94, in __exit__
six.reraise(dj_exc_type, dj_exc_value, traceback)
File "/home/felix/felix_env/lib/python3.5/site-packages/django/utils/six.py", line 685, in reraise
raise value.with_traceback(tb)
File "/home/felix/felix_env/lib/python3.5/site-packages/django/db/backends/utils.py", line 65, in execute
return self.cursor.execute(sql, params)
File "/home/felix/felix_env/lib/python3.5/site-packages/django/db/backends/sqlite3/base.py", line 328, in execute
return Database.Cursor.execute(self, query, params)
django.db.utils.IntegrityError: UNIQUE constraint failed: webapp_helptext.id