Latest posts on Помогите с обновлением Поста в Django topichttp://python.su/forum/topic/37628/2019-08-20T09:45:02+03:00Веб-технологии :: Django :: Помогите с обновлением Поста в Django
2019-08-20T09:45:02+03:00barzini203791<blockquote><em>FishHook</em><br/>Во-первых, чтобы редактировалось, надо получить существующий объект, изменить у него нужные поля и сохранить его в базу. Ваша форма принудительно создает новый объект.<br/>Во-вторых, в Джанге принято идентифицировать объекты по pk, а slug нужен для SEO, не стОит использовать его для идентификации объекта, потому что slug в отличие от pk (то есть id) может изменяться, да и вообще как мне кажется держать индекс на varchar так себе затея.<br/><br/></blockquote><br/>Спасибо. Возможно с нуля буду создавать сайт. По другим учебникам <br/><br/>
Веб-технологии :: Django :: Помогите с обновлением Поста в Django
2019-08-13T09:17:49+03:00FishHook203646<div class="code"><pre> <span class="k">def</span> <span class="nf">save</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">new_post</span> <span class="o">=</span> <span class="n">Post</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="n">title</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">cleaned_data</span><span class="p">[</span><span class="s1">'title'</span><span class="p">],</span>
<span class="n">slug</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">cleaned_data</span><span class="p">[</span><span class="s1">'slug'</span><span class="p">],</span>
<span class="n">body</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">cleaned_data</span><span class="p">[</span><span class="s1">'body'</span><span class="p">])</span>
<span class="k">return</span> <span class="n">new_post</span>
</pre></div><br/>О как!<br/><blockquote><em>barzini</em><br/>но в итоге у меня создаётся новый Post, и тот что я редактировал - не удаляется</blockquote>Всё что делает ваш метод save у формы - создает новый объект. Собственно, чего другого вы ожидаете?<br/><br/><blockquote><em>barzini</em><br/>Как сделать так, что бы не просило изменить slug, и нормально редактировалось</blockquote>Во-первых, чтобы редактировалось, надо получить существующий объект, изменить у него нужные поля и сохранить его в базу. Ваша форма принудительно создает новый объект. <br/>Во-вторых, в Джанге принято идентифицировать объекты по pk, а slug нужен для SEO, не стОит использовать его для идентификации объекта, потому что slug в отличие от pk (то есть id) может изменяться, да и вообще как мне кажется держать индекс на varchar так себе затея.
Веб-технологии :: Django :: Помогите с обновлением Поста в Django
2019-08-12T20:22:14+03:00barzini203638<blockquote><em>FishHook</em><br/>barziniОтлично! Вы пришли за советом, заметьте никто вам ничего не должен. Совет вы получили, нравится он вам или нет - я не обязан соответствовать вашим ожиданиям, а вы не имеете никакого морального права хамить в ответ и оскорблять. Я вообще то потратил на вас время, и с вашей стороны ожидается благодарность, а не хамство. Теперь по делу. 1.</blockquote><br/>Код формы<br/><br/><div class="code"><pre> <span class="kn">from</span> <span class="nn">django</span> <span class="kn">import</span> <span class="n">forms</span>
<span class="kn">from</span> <span class="nn">.models</span> <span class="kn">import</span> <span class="n">Post</span>
<span class="kn">from</span> <span class="nn">django.core.exceptions</span> <span class="kn">import</span> <span class="n">ValidationError</span>
<span class="k">class</span> <span class="nc">PostForm</span><span class="p">(</span><span class="n">forms</span><span class="o">.</span><span class="n">ModelForm</span><span class="p">):</span>
<span class="c1">#title = forms.CharField(max_length=50)</span>
<span class="c1">#slug = forms.CharField(max_length=50)</span>
<span class="c1">#body = forms.CharField(max_length=500)</span>
<span class="c1">#bootstrap стиль до формы создания поста</span>
<span class="c1">#title.widget.attrs.update({'class': 'form-control'})</span>
<span class="c1">#slug.widget.attrs.update({'class': 'form-control'})</span>
<span class="c1">#body.widget.attrs.update({'class': 'form-control'})</span>
<span class="k">class</span> <span class="nc">Meta</span><span class="p">:</span>
<span class="n">model</span> <span class="o">=</span> <span class="n">Post</span>
<span class="n">fields</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'title'</span><span class="p">,</span> <span class="s1">'slug'</span><span class="p">,</span> <span class="s1">'body'</span><span class="p">]</span>
<span class="n">widgets</span> <span class="o">=</span> <span class="p">{</span>
<span class="s1">'title'</span><span class="p">:</span> <span class="n">forms</span><span class="o">.</span><span class="n">TextInput</span><span class="p">(</span><span class="n">attrs</span><span class="o">=</span><span class="p">{</span><span class="s1">'class'</span><span class="p">:</span><span class="s1">'form-control'</span><span class="p">}),</span>
<span class="s1">'slug'</span><span class="p">:</span> <span class="n">forms</span><span class="o">.</span><span class="n">TextInput</span><span class="p">(</span><span class="n">attrs</span><span class="o">=</span><span class="p">{</span><span class="s1">'class'</span><span class="p">:</span><span class="s1">'form-control'</span><span class="p">})</span>
<span class="p">}</span>
<span class="k">def</span> <span class="nf">clean_slug</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">new_slug</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">cleaned_data</span><span class="p">[</span><span class="s1">'slug'</span><span class="p">]</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
<span class="k">if</span> <span class="n">new_slug</span> <span class="o">==</span> <span class="s2">"create"</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">ValidationError</span><span class="p">(</span><span class="s1">'Slug may not be "create"'</span><span class="p">)</span>
<span class="k">if</span> <span class="n">Post</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">slug__iexact</span><span class="o">=</span><span class="n">new_slug</span><span class="p">)</span><span class="o">.</span><span class="n">count</span><span class="p">():</span>
<span class="k">raise</span> <span class="n">ValidationError</span><span class="p">(</span><span class="s1">'Slug must be unique!'</span><span class="p">)</span>
<span class="k">return</span> <span class="n">new_slug</span>
<span class="k">def</span> <span class="nf">save</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">new_post</span> <span class="o">=</span> <span class="n">Post</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="n">title</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">cleaned_data</span><span class="p">[</span><span class="s1">'title'</span><span class="p">],</span>
<span class="n">slug</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">cleaned_data</span><span class="p">[</span><span class="s1">'slug'</span><span class="p">],</span>
<span class="n">body</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">cleaned_data</span><span class="p">[</span><span class="s1">'body'</span><span class="p">])</span>
<span class="k">return</span> <span class="n">new_post</span>
</pre></div><br/>Вообще проблема в том что при редактировании, когда я меняю title + body. нужно объязательно изменить и slug. В итоге при изменении, я как бы создаю новый пост. Как сделать так, что бы не просило изменить slug, и нормально редактировалось
Веб-технологии :: Django :: Помогите с обновлением Поста в Django
2019-08-12T11:09:41+03:00FishHook203617<strong>barzini</strong><br/>Отлично! Вы пришли за советом, заметьте никто вам ничего не должен. Совет вы получили, нравится он вам или нет - я не обязан соответствовать вашим ожиданиям, а вы не имеете никакого морального права хамить в ответ и оскорблять. Я вообще то потратил на вас время, и с вашей стороны ожидается благодарность, а не хамство. <br/><br/>Теперь по делу. <br/>1. <blockquote><em>barzini</em><br/>Я делаю, так как мне лучше</blockquote>Вы делаете то, что уже давно сделано. Все ваши миксины есть в составе CBV джанги. Прошу все таки переступить через себя поглядеть таки в документацию, которую как вы говорите читали <a href="https://docs.djangoproject.com/en/2.2/topics/class-based-views/">https://docs.djangoproject.com/en/2.2/topics/class-based-views/</a>. <br/><br/>2. Покажите код формы. <br/>
Веб-технологии :: Django :: Помогите с обновлением Поста в Django
2019-08-11T09:24:55+03:00barzini203598<blockquote><em>FishHook</em><br/>Ошибка очевидна, она коренится в методологии изучения предмета.<br/>Вот есть фреймворк Django, его создавали для внутренних нужд компании, но впоследствии решили, что а почему бы и не открыть свои разработки миру? Разрабы написали документацию, создали тематический сайт, сделали туториал. Это все есть и доступно по ссылке, вы не поверите, <a href="https://www.djangoproject.com/.">https://www.djangoproject.com/.</a> Любой, кто желает получить информацию о джанге может получить её там и только там. Кто такой хрен на ютубе - неведомо. Зачем нужен его канал, когда есть оригинальная документация разжеваная в пыль - неясно.<br/>Понимаете, чтобы ответить на ваш вопрос, надо сначала вслед за вами посмотреть этот канал, чтобы вообще понять на кой черт вы городите какие-то миксины, кто вас этому научил и что у вас обоих теперь в голове.<br/></blockquote><br/>Я делаю, так как мне лучше. Я читал документацию, она мне не укажет на суть проблемы. Если не знаете, где скрывается ошибка, то зачем свой высер “гения” здесь подавать?
Веб-технологии :: Django :: Помогите с обновлением Поста в Django
2019-08-10T22:02:37+03:00FishHook203594<blockquote><em>barzini</em><br/>Хочу понять где у меня ошибка</blockquote><blockquote><em>barzini</em><br/>Создаю сайт в первый раз на Django. С помощью одного ютуб канал</blockquote>Ошибка очевидна, она коренится в методологии изучения предмета. <br/>Вот есть фреймворк Django, его создавали для внутренних нужд компании, но впоследствии решили, что а почему бы и не открыть свои разработки миру? Разрабы написали документацию, создали тематический сайт, сделали туториал. Это все есть и доступно по ссылке, вы не поверите, <a href="https://www.djangoproject.com/">https://www.djangoproject.com/</a>. Любой, кто желает получить информацию о джанге может получить её там и только там. Кто такой хрен на ютубе - неведомо. Зачем нужен его канал, когда есть оригинальная документация разжеваная в пыль - неясно. <br/>Понимаете, чтобы ответить на ваш вопрос, надо сначала вслед за вами посмотреть этот канал, чтобы вообще понять на кой черт вы городите какие-то миксины, кто вас этому научил и что у вас обоих теперь в голове.
Веб-технологии :: Django :: Помогите с обновлением Поста в Django
2019-08-09T21:12:09+03:00barzini203580Создаю сайт в первый раз на Django. С помощью одного ютуб канала, делаю всё как по видео. Но в итоге, не могу уже пару дней понять свою ошибку. Я с помощью миксина хочу сделать так, что бы я мог обновить свой Post. Я это сделал, в итоге я могу зайди в созданный Post, его отредактировать, но в итоге у меня создаётся новый Post, и тот что я редактировал - не удаляется. Хочу понять где у меня ошибка, что бы у меня всё правильно редактировалось, а не создавало новые посты и сохраняло прошлый. Спасибо.<br/><br/><span style="font-size:32px">post_update.html</span><br/><div class="code"><pre> {% extends 'dota2/wrapper.html' %}
{% block title %}
Edit - {{ post.title }}
{% endblock %}
{% block content %}
<span class="p"><</span><span class="nt">form</span> <span class="na">action</span><span class="o">=</span><span class="s">"{{ post.get_update_url}}"</span> <span class="na">method</span><span class="o">=</span><span class="s">"post"</span><span class="p">></span>
{% csrf_token %}
{% for field in form %}
<span class="p"><</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">'form-group'</span><span class="p">></span>
{% if field.errors %}
<span class="p"><</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">'alert alert-danger'</span><span class="p">></span>
{{ field.errors }}
<span class="p"></</span><span class="nt">div</span><span class="p">></span>
{% endif %}
{{ field.label }}
{{ field }}
<span class="p"></</span><span class="nt">div</span><span class="p">></span>
{% endfor %}
<span class="p"><</span><span class="nt">button</span> <span class="na">type</span><span class="o">=</span><span class="s">"submit"</span> <span class="na">class</span><span class="o">=</span><span class="s">'btn btn-primary'</span> <span class="p">></span>Update Post<span class="p"></</span><span class="nt">button</span><span class="p">></span>
<span class="p"></</span><span class="nt">form</span><span class="p">></span>
{% endblock %}
</pre></div><br/><span style="font-size:32px">urls.py</span><br/><div class="code"><pre> <span class="kn">from</span> <span class="nn">django.urls</span> <span class="kn">import</span> <span class="n">path</span><span class="p">,</span> <span class="n">include</span>
<span class="kn">from</span> <span class="nn">.models</span> <span class="kn">import</span> <span class="n">Post</span>
<span class="kn">from</span> <span class="nn">.views</span> <span class="kn">import</span> <span class="o">*</span>
<span class="n">urlpatterns</span> <span class="o">=</span> <span class="p">[</span>
<span class="n">path</span><span class="p">(</span><span class="s1">''</span><span class="p">,</span> <span class="n">posts_list</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s1">'post_list_url'</span><span class="p">),</span>
<span class="n">path</span><span class="p">(</span><span class="s1">'post/<str:slug>/'</span><span class="p">,</span> <span class="n">PostDetail</span><span class="o">.</span><span class="n">as_view</span><span class="p">(),</span> <span class="n">name</span><span class="o">=</span><span class="s2">"post_detail_url"</span><span class="p">),</span>
<span class="n">path</span><span class="p">(</span><span class="s1">'post/<str:slug>/update/'</span><span class="p">,</span> <span class="n">PostUpdate</span><span class="o">.</span><span class="n">as_view</span><span class="p">(),</span> <span class="n">name</span><span class="o">=</span><span class="s2">"post_update_url"</span><span class="p">),</span>
<span class="n">path</span><span class="p">(</span><span class="s1">'create/'</span><span class="p">,</span> <span class="n">PostCreate</span><span class="o">.</span><span class="n">as_view</span><span class="p">(),</span> <span class="n">name</span><span class="o">=</span><span class="s1">'post_create_url'</span><span class="p">),</span>
<span class="p">]</span>
</pre></div><br/><span style="font-size:32px">models.py</span><br/> <div class="code"><pre> <span class="kn">from</span> <span class="nn">django.db</span> <span class="kn">import</span> <span class="n">models</span>
<span class="kn">from</span> <span class="nn">django.shortcuts</span> <span class="kn">import</span> <span class="n">reverse</span>
<span class="kn">from</span> <span class="nn">django.utils.text</span> <span class="kn">import</span> <span class="n">slugify</span>
<span class="kn">from</span> <span class="nn">time</span> <span class="kn">import</span> <span class="n">time</span>
<span class="k">def</span> <span class="nf">gen_slug</span><span class="p">(</span><span class="n">s</span><span class="p">):</span>
<span class="n">new_slug</span> <span class="o">=</span> <span class="n">slugify</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">allow_unicode</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="k">return</span> <span class="n">new_slug</span> <span class="o">+</span> <span class="s1">'-'</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="p">()))</span>
<span class="k">class</span> <span class="nc">Post</span><span class="p">(</span><span class="n">models</span><span class="o">.</span><span class="n">Model</span><span class="p">):</span>
<span class="n">title</span> <span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">CharField</span><span class="p">(</span><span class="n">max_length</span><span class="o">=</span><span class="mi">120</span><span class="p">,</span> <span class="n">db_index</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="n">slug</span> <span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">SlugField</span><span class="p">(</span><span class="n">max_length</span><span class="o">=</span><span class="mi">150</span><span class="p">,</span> <span class="n">unique</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="n">body</span> <span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">TextField</span><span class="p">(</span><span class="n">blank</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">db_index</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="n">date</span> <span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">DateTimeField</span><span class="p">(</span><span class="n">auto_now_add</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="c1">#images = models.ImageField(upload_to='main/static/main/accsimages/', blank=True, verbose_name='подпись')</span>
<span class="c1">#images = models.ImageField(upload_to='main/static/main/accsimages/', blank=True, height_field=None, width_field=None, max_length=100)</span>
<span class="k">def</span> <span class="nf">get_absolute_url</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="n">reverse</span><span class="p">(</span><span class="s1">'post_detail_url'</span><span class="p">,</span> <span class="n">kwargs</span><span class="o">=</span><span class="p">{</span><span class="s1">'slug'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">slug</span><span class="p">})</span>
<span class="k">def</span> <span class="nf">get_update_url</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="n">reverse</span><span class="p">(</span><span class="s1">'post_update_url'</span><span class="p">,</span> <span class="n">kwargs</span><span class="o">=</span><span class="p">{</span><span class="s1">'slug'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">slug</span><span class="p">})</span>
<span class="k">def</span> <span class="nf">save</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">id</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">slug</span> <span class="o">=</span> <span class="n">gen_slug</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">title</span><span class="p">)</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">save</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="k">def</span> <span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">title</span>
</pre></div><br/><span style="font-size:32px">utils.py</span><br/><div class="code"><pre> <span class="kn">from</span> <span class="nn">django.shortcuts</span> <span class="kn">import</span> <span class="n">render</span>
<span class="kn">from</span> <span class="nn">django.shortcuts</span> <span class="kn">import</span> <span class="n">redirect</span>
<span class="kn">from</span> <span class="nn">django.shortcuts</span> <span class="kn">import</span> <span class="n">get_object_or_404</span>
<span class="kn">from</span> <span class="nn">django.views.generic</span> <span class="kn">import</span> <span class="n">ListView</span><span class="p">,</span> <span class="n">CreateView</span><span class="p">,</span> <span class="n">UpdateView</span>
<span class="kn">from</span> <span class="nn">.models</span> <span class="kn">import</span> <span class="o">*</span>
<span class="k">class</span> <span class="nc">ObjectDetailMixin</span><span class="p">:</span>
<span class="n">model</span> <span class="o">=</span> <span class="bp">None</span>
<span class="n">template</span> <span class="o">=</span> <span class="bp">None</span>
<span class="k">def</span> <span class="nf">get</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">,</span> <span class="n">slug</span><span class="p">):</span>
<span class="c1">#post = Post.objects.get(slug__iexact=slug)</span>
<span class="n">obj</span> <span class="o">=</span> <span class="n">get_object_or_404</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="p">,</span> <span class="n">slug__iexact</span><span class="o">=</span><span class="n">slug</span><span class="p">)</span>
<span class="k">return</span> <span class="n">render</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">template</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="p">{</span><span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="vm">__name__</span><span class="o">.</span><span class="n">lower</span><span class="p">():</span><span class="n">obj</span><span class="p">})</span>
<span class="k">class</span> <span class="nc">ObjectCreateMixin</span><span class="p">:</span>
<span class="n">model_form</span> <span class="o">=</span> <span class="bp">None</span>
<span class="n">template</span> <span class="o">=</span> <span class="bp">None</span>
<span class="k">def</span> <span class="nf">get</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">):</span>
<span class="n">form</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">model_form</span><span class="p">()</span>
<span class="k">return</span> <span class="n">render</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">template</span><span class="p">,</span><span class="n">context</span><span class="o">=</span><span class="p">{</span><span class="s1">'form'</span><span class="p">:</span> <span class="n">form</span><span class="p">})</span>
<span class="k">def</span> <span class="nf">post</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">):</span>
<span class="n">bound_form</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">model_form</span><span class="p">(</span><span class="n">request</span><span class="o">.</span><span class="n">POST</span><span class="p">)</span>
<span class="k">if</span> <span class="n">bound_form</span><span class="o">.</span><span class="n">is_valid</span><span class="p">():</span>
<span class="n">new_obj</span> <span class="o">=</span> <span class="n">bound_form</span><span class="o">.</span><span class="n">save</span><span class="p">()</span>
<span class="k">return</span> <span class="n">redirect</span><span class="p">(</span><span class="n">new_obj</span><span class="p">)</span>
<span class="k">return</span> <span class="n">render</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">template</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="p">{</span><span class="s1">'form'</span><span class="p">:</span> <span class="n">bound_form</span><span class="p">})</span>
<span class="k">class</span> <span class="nc">ObjectUpdateMixin</span><span class="p">:</span>
<span class="n">model</span> <span class="o">=</span> <span class="bp">None</span>
<span class="n">model_form</span> <span class="o">=</span> <span class="bp">None</span>
<span class="n">template</span> <span class="o">=</span> <span class="bp">None</span>
<span class="k">def</span> <span class="nf">get</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">,</span> <span class="n">slug</span><span class="p">):</span>
<span class="n">obj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">slug__iexact</span><span class="o">=</span><span class="n">slug</span><span class="p">)</span>
<span class="n">bound_form</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">model_form</span><span class="p">(</span><span class="n">instance</span><span class="o">=</span><span class="n">obj</span><span class="p">)</span>
<span class="k">return</span> <span class="n">render</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">template</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="p">{</span><span class="s1">'form'</span><span class="p">:</span> <span class="n">bound_form</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="vm">__name__</span><span class="o">.</span><span class="n">lower</span><span class="p">():</span> <span class="n">obj</span><span class="p">})</span>
<span class="k">def</span> <span class="nf">post</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">,</span> <span class="n">slug</span><span class="p">):</span>
<span class="n">obj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">slug__iexact</span><span class="o">=</span><span class="n">slug</span><span class="p">)</span>
<span class="n">bound_form</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">model_form</span><span class="p">(</span><span class="n">request</span><span class="o">.</span><span class="n">POST</span><span class="p">,</span> <span class="n">instance</span><span class="o">=</span><span class="n">obj</span><span class="p">)</span>
<span class="k">if</span> <span class="n">bound_form</span><span class="o">.</span><span class="n">is_valid</span><span class="p">():</span>
<span class="n">new_obj</span> <span class="o">=</span> <span class="n">bound_form</span><span class="o">.</span><span class="n">save</span><span class="p">()</span>
<span class="k">return</span> <span class="n">redirect</span><span class="p">(</span><span class="n">new_obj</span><span class="p">)</span>
<span class="k">return</span> <span class="n">render</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">template</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="p">{</span><span class="s1">'form'</span><span class="p">:</span> <span class="n">bound_form</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="vm">__name__</span><span class="o">.</span><span class="n">lower</span><span class="p">():</span> <span class="n">obj</span><span class="p">})</span>
</pre></div><br/><span style="font-size:32px">views.py</span><br/><div class="code"><pre> <span class="kn">from</span> <span class="nn">django.shortcuts</span> <span class="kn">import</span> <span class="n">render</span>
<span class="kn">from</span> <span class="nn">django.shortcuts</span> <span class="kn">import</span> <span class="n">redirect</span>
<span class="kn">from</span> <span class="nn">django.shortcuts</span> <span class="kn">import</span> <span class="n">get_object_or_404</span>
<span class="kn">from</span> <span class="nn">django.views.generic</span> <span class="kn">import</span> <span class="n">ListView</span><span class="p">,</span> <span class="n">CreateView</span><span class="p">,</span> <span class="n">UpdateView</span><span class="p">,</span> <span class="n">View</span>
<span class="kn">from</span> <span class="nn">.models</span> <span class="kn">import</span> <span class="n">Post</span>
<span class="kn">from</span> <span class="nn">.forms</span> <span class="kn">import</span> <span class="n">PostForm</span>
<span class="kn">from</span> <span class="nn">.utils</span> <span class="kn">import</span> <span class="o">*</span>
<span class="k">def</span> <span class="nf">posts_list</span><span class="p">(</span><span class="n">request</span><span class="p">):</span>
<span class="n">posts</span> <span class="o">=</span> <span class="n">Post</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">all</span><span class="p">()</span>
<span class="k">return</span> <span class="n">render</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="s1">'dota2/posts.html'</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="p">{</span><span class="s1">'posts'</span><span class="p">:</span> <span class="n">posts</span><span class="p">})</span>
<span class="k">class</span> <span class="nc">PostCreate</span><span class="p">(</span><span class="n">View</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">get</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">):</span>
<span class="n">form</span> <span class="o">=</span> <span class="n">PostForm</span><span class="p">()</span>
<span class="k">return</span> <span class="n">render</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="s1">'dota2/post_create.html'</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="p">{</span><span class="s1">'form'</span><span class="p">:</span><span class="n">form</span><span class="p">})</span>
<span class="k">def</span> <span class="nf">post</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">):</span>
<span class="n">bound_form</span> <span class="o">=</span> <span class="n">PostForm</span><span class="p">(</span><span class="n">request</span><span class="o">.</span><span class="n">POST</span><span class="p">)</span>
<span class="k">if</span> <span class="n">bound_form</span><span class="o">.</span><span class="n">is_valid</span><span class="p">():</span>
<span class="n">new_post</span> <span class="o">=</span> <span class="n">bound_form</span><span class="o">.</span><span class="n">save</span><span class="p">()</span>
<span class="k">return</span> <span class="n">redirect</span><span class="p">(</span><span class="n">new_post</span><span class="p">)</span>
<span class="k">return</span> <span class="n">render</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="s1">'dota2/post_create.html'</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="p">{</span><span class="s1">'form'</span><span class="p">,</span> <span class="n">bound_form</span><span class="p">})</span>
<span class="k">class</span> <span class="nc">PostDetail</span><span class="p">(</span><span class="n">ObjectDetailMixin</span><span class="p">,</span> <span class="n">View</span><span class="p">):</span>
<span class="n">model</span> <span class="o">=</span> <span class="n">Post</span>
<span class="n">template</span> <span class="o">=</span> <span class="s1">'dota2/post_detail.html'</span>
<span class="c1"># def get(self, request, slug):</span>
<span class="c1"># post = get_object_or_404(Post, slug__iexact=slug)</span>
<span class="c1"># return render(request, 'dota2/post_detail.html', context={'post':post})</span>
<span class="k">class</span> <span class="nc">PostUpdate</span><span class="p">(</span><span class="n">ObjectUpdateMixin</span><span class="p">,</span> <span class="n">View</span><span class="p">):</span>
<span class="n">model</span> <span class="o">=</span> <span class="n">Post</span>
<span class="n">model_form</span> <span class="o">=</span> <span class="n">PostForm</span>
<span class="n">template</span> <span class="o">=</span> <span class="s1">'dota2/post_update.html'</span>
</pre></div><br/>