@nurzhannogerbek

Как реализовать возможность предпросмотра как в Тостере?

Здравствуйте, помогите пожалуйста разобраться. В Тостере есть предпросмотр 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
  • Вопрос задан
  • 249 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы