Здравствуйте, помогите пожалуйста разобраться. В Тостере есть предпросмотр cоздаваемого вопроса. Пытаюсь создать что-то на подобии в своем Джанго проекте.
Есть форма редактирования статьи с двумя кнопками и двумя полями. Первая кнопка submit, вторая кнопка preview. Одно из полей является CharField и в ней хранится html разметка. На это поле накинул wysiwyg редактор. Сама форма находится в модальном окне.
Стоит следующая задача. При нажатии на вторую кнопку (preview) хочу post запросом через аjax посылать данные из полей в Redis. Далее содержимое формы менять на эти временные данные, чтобы получить некое превью.
Пытаюсь связать свой Django проект c Redis. Использую для это приложение:
django-redis.
settings.py:CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/1",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
Есть два вопроса.
1. Как данные из полей записывать в Redis в Сlass Based View? Пока что я прикрутил декоратор cache_page к url. Не уверен, что это best practice.
2. Второй вопрос косательно ajax-а. Не могу сообразить как он должен вообще выглядить в моем конкретном случаи.
То что на данный момент попробовал:
template:<form method="post" action="{% url 'article:article_edit' article.id %}" class="article-edit-form" enctype="multipart/form-data">
{% csrf_token %}
<a id="article-preview-btn" class="btn btn-info" data-url="{% url 'article:article_preview' article.id %}">
<span>{% trans "Превью" %}</span>
</a>
<button type="submit" class="btn btn-success">{% trans 'Обновить' %}</button>
</form>
urls.py:from django.views.decorators.cache import cache_page
url(r'^(?P<pk>\d+)/preview/$',
cache_page(15 * 60)(ArticlePreview.as_view()),
name='article_preview'),
views.py:class ArticlePreview(FormView):
form_class = ArticleForm
def form_valid(self, form):
data = dict()
data['session'] = self.request.session
data['title'] = form.cleaned_data['title']
data['body'] = form.cleaned_data['body']
return JsonResponse(data)
JS:$("#article-modal").on("click", "#article-preview-btn", function () {
var btn = $(this);
$.ajax({
url: btn.attr("data-url"),
type: 'post',
dataType: 'json',
success: function (data) {
???
}
});
});
ERROR:Internal Server Error: /article/1/preview/
Traceback (most recent call last):
File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35\lib\site-packages\django\core\handlers\exception.py", line 41, in inner
response = get_response(request)
File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35\lib\site-packages\django\core\handlers\base.py", line 187, in _get_response
response = self.process_exception_by_middleware(e, request)
File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35\lib\site-packages\django\core\handlers\base.py", line 185, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35\lib\site-packages\django\utils\decorators.py", line 149, in _wrapped_view
response = view_func(request, *args, **kwargs)
File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35\lib\site-packages\django\views\generic\base.py", line 68, in view
return self.dispatch(request, *args, **kwargs)
File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35\lib\site-packages\django\views\generic\base.py", line 88, in dispatch
return handler(request, *args, **kwargs)
File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35\lib\site-packages\django\views\generic\edit.py", line 181, in post
form = self.get_form()
File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35\lib\site-packages\django\views\generic\edit.py", line 45, in get_form
return form_class(**self.get_form_kwargs())
TypeError: __init__() missing 1 required positional argument: 'user'
[18/Dec/2017 23:34:23] "POST /article/1/preview/ HTTP/1.1" 500 16682