Latest posts on Django PYTHON topichttps://python.su/forum/topic/38760/2020-04-10T12:43:30+03:00Веб-технологии :: Django :: Django PYTHON
2020-04-10T12:43:30+03:00m0nte-cr1st0209055<blockquote><em>7emsk</em><br/>Теперь другая ошибка</blockquote>иногда полезно показывать код.
Веб-технологии :: Django :: Django PYTHON
2020-04-09T19:52:32+03:007emsk209020<blockquote><em>FishHook</em><br/>7emskВероятно неправильным образом начали изучать, пройдите официальный туториал для начала, потом почитайте документацию по классам, которые используете. Я не знаю, что вам сказать больше чем дала подсказка Джанги. Вам написали "Производные CreateView должны содержать атрибуты model или queryset, либо надо переопределить метод get_queryset. Вот ваш класс</blockquote>Теперь другая ошибка <br/>
Веб-технологии :: Django :: Django PYTHON
2020-04-09T19:20:03+03:00FishHook209014<strong>7emsk</strong><br/>Вероятно неправильным образом начали изучать, пройдите официальный туториал для начала, потом почитайте документацию по классам, которые используете. Я не знаю, что вам сказать больше чем дала подсказка Джанги. Вам написали "<br/>Производные CreateView должны содержать атрибуты model или queryset, либо надо переопределить метод get_queryset. <br/>Вот ваш класс<br/><div class="code"><pre> <span class="k">class</span> <span class="nc">BbCreateView</span><span class="p">(</span><span class="n">CreateView</span><span class="p">):</span>
<span class="n">template_name</span> <span class="o">=</span> <span class="s1">'Spam/create.html'</span>
<span class="n">form_class</span> <span class="o">=</span> <span class="n">BbForm</span>
<span class="n">success_url</span> <span class="o">=</span> <span class="s1">'/Spam/'</span>
<span class="k">def</span> <span class="nf">get_context_data</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="n">context</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get_context_data</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="n">context</span><span class="p">[</span><span class="s1">'rubrics'</span><span class="p">]</span> <span class="o">=</span> <span class="n">Rubric</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">context</span>
</pre></div><br/>должен создавать объект некой модели и записывать его в базу данных. Очевидно, что фреймворку недостаточно информации о том, инстанс какой именно модели надо создавать. И вам дали три пути как разрешить эту ситуацию. Что непонятно?
Веб-технологии :: Django :: Django PYTHON
2020-04-09T18:47:19+03:007emsk209010<blockquote><em>FishHook</em><br/>Вам же написали чего не хватает и что нужно сделать</blockquote>Можно подробно или ссылку как это написать, а то начал изучать и куча не допонимании
Веб-технологии :: Django :: Django PYTHON
2020-04-09T15:12:31+03:00FishHook209000Вам же написали чего не хватает и что нужно сделать<br/><br/><img src="https://i.ibb.co/68nNK34/dc3d730e5157a388f754aaec96e03c5f.png"></img>
Веб-технологии :: Django :: Django PYTHON
2020-04-09T14:09:37+03:007emsk208991Здравствуйте ))<br/>Столкнулся ошибками формы, уже 3 день лазию по форумам хоть бы кто нибудь адекватно помог мне в моей проблемы ((<br/>После нажатия на ссылку добавить выскакивает ошибки и сайт не открывается((<br/>Программа указывает на ошибку строки 33 в файле edit но после того как я перешел я не могу понять что делать ((<br/>Вот сама ошибка <br/><div class="code"><pre> <span class="k">return</span> <span class="n">form_class</span> <span class="p">(</span><span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">get_form_kwargs</span><span class="p">())</span>
</pre></div>Потом я удалил и сайт открылся но форма не передает данные на страницу ((<br/><div class="code"><pre> <span class="k">return</span> <span class="n">form_class</span>
</pre></div>Файл views.py <br/><div class="code"><pre> <span class="kn">from</span> <span class="nn">django.http</span> <span class="kn">import</span> <span class="n">HttpResponse</span>
<span class="kn">from</span> <span class="nn">django.template</span> <span class="kn">import</span> <span class="n">loader</span>
<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.views.generic.edit</span> <span class="kn">import</span> <span class="n">CreateView</span>
<span class="kn">from</span> <span class="nn">.forms</span> <span class="kn">import</span> <span class="n">BbForm</span>
<span class="kn">from</span> <span class="nn">.models</span> <span class="kn">import</span> <span class="n">Bb</span>
<span class="kn">from</span> <span class="nn">.models</span> <span class="kn">import</span> <span class="n">Rubric</span>
<span class="k">def</span> <span class="nf">index</span> <span class="p">(</span><span class="n">request</span><span class="p">):</span>
<span class="n">template</span> <span class="o">=</span> <span class="n">loader</span><span class="o">.</span><span class="n">get_template</span><span class="p">(</span><span class="s1">'Spam/index.html'</span><span class="p">)</span>
<span class="n">bbs</span> <span class="o">=</span> <span class="n">Bb</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="n">rubrics</span> <span class="o">=</span> <span class="n">Rubric</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="n">context</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'bbs'</span> <span class="p">:</span> <span class="n">bbs</span><span class="p">,</span> <span class="s1">'rubrics'</span> <span class="p">:</span> <span class="n">rubrics</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">'Spam/index.html'</span><span class="p">,</span> <span class="n">context</span><span class="p">)</span>
<span class="n">s</span> <span class="o">=</span> <span class="s1">'Список объявлений</span><span class="se">\r\n\r\n\r\n</span><span class="s1">'</span>
<span class="k">for</span> <span class="n">bb</span> <span class="ow">in</span> <span class="n">Bb</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">order_by</span><span class="p">(</span><span class="s1">'-published'</span><span class="p">):</span>
<span class="n">s</span> <span class="o">+=</span> <span class="n">bb</span><span class="o">.</span><span class="n">title</span> <span class="o">+</span> <span class="s1">'</span><span class="se">\r\n</span><span class="s1">'</span> <span class="o">+</span> <span class="n">bb</span><span class="o">.</span><span class="n">content</span> <span class="o">+</span> <span class="s1">'</span><span class="se">\r\n\r\n</span><span class="s1">'</span>
<span class="k">return</span> <span class="n">HttpResponse</span><span class="p">(</span><span class="n">template</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="n">context</span><span class="p">,</span> <span class="n">request</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">by_rubric</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">rubric_id</span><span class="p">):</span>
<span class="n">bbs</span> <span class="o">=</span> <span class="n">Bb</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">rubric</span><span class="o">=</span><span class="n">rubric_id</span><span class="p">)</span>
<span class="n">rubrics</span> <span class="o">=</span> <span class="n">Rubric</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="n">current_rubric</span> <span class="o">=</span> <span class="n">Rubric</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">pk</span><span class="o">=</span><span class="n">rubric_id</span><span class="p">)</span>
<span class="n">context</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'bbs'</span> <span class="p">:</span> <span class="n">bbs</span><span class="p">,</span> <span class="s1">'rubrics'</span> <span class="p">:</span> <span class="n">rubrics</span><span class="p">,</span> <span class="s1">'current_rubric'</span> <span class="p">:</span> <span class="n">current_rubric</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">'Spam/by_rubric.html'</span><span class="p">,</span> <span class="n">context</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">BbCreateView</span><span class="p">(</span><span class="n">CreateView</span><span class="p">):</span>
<span class="n">template_name</span> <span class="o">=</span> <span class="s1">'Spam/create.html'</span>
<span class="n">form_class</span> <span class="o">=</span> <span class="n">BbForm</span>
<span class="n">success_url</span> <span class="o">=</span> <span class="s1">'/Spam/'</span>
<span class="k">def</span> <span class="nf">get_context_data</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="n">context</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get_context_data</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="n">context</span><span class="p">[</span><span class="s1">'rubrics'</span><span class="p">]</span> <span class="o">=</span> <span class="n">Rubric</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">context</span>
</pre></div>Файл edit.py <br/><div class="code"><pre> <span class="kn">from</span> <span class="nn">django.core.exceptions</span> <span class="kn">import</span> <span class="n">ImproperlyConfigured</span>
<span class="kn">from</span> <span class="nn">django.forms</span> <span class="kn">import</span> <span class="n">models</span> <span class="k">as</span> <span class="n">model_forms</span>
<span class="kn">from</span> <span class="nn">django.http</span> <span class="kn">import</span> <span class="n">HttpResponseRedirect</span>
<span class="kn">from</span> <span class="nn">django.views.generic.base</span> <span class="kn">import</span> <span class="n">ContextMixin</span><span class="p">,</span> <span class="n">TemplateResponseMixin</span><span class="p">,</span> <span class="n">View</span>
<span class="kn">from</span> <span class="nn">django.views.generic.detail</span> <span class="kn">import</span> <span class="p">(</span>
<span class="n">BaseDetailView</span><span class="p">,</span> <span class="n">SingleObjectMixin</span><span class="p">,</span> <span class="n">SingleObjectTemplateResponseMixin</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">class</span> <span class="nc">FormMixin</span><span class="p">(</span><span class="n">ContextMixin</span><span class="p">):</span>
<span class="sd">"""Provide a way to show and handle a form in a request."""</span>
<span class="n">initial</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">form_class</span> <span class="o">=</span> <span class="bp">None</span>
<span class="n">success_url</span> <span class="o">=</span> <span class="bp">None</span>
<span class="n">prefix</span> <span class="o">=</span> <span class="bp">None</span>
<span class="k">def</span> <span class="nf">get_initial</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">"""Return the initial data to use for forms on this view."""</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">initial</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">get_prefix</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">"""Return the prefix to use for forms."""</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">prefix</span>
<span class="k">def</span> <span class="nf">get_form_class</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">"""Return the form class to use."""</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">form_class</span>
<span class="k">def</span> <span class="nf">get_form</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">form_class</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="sd">"""Return an instance of the form to be used in this view."""</span>
<span class="k">if</span> <span class="n">form_class</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
<span class="n">form_class</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_form_class</span><span class="p">()</span>
<span class="k">return</span> <span class="n">form_class</span> <span class="p">(</span><span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">get_form_kwargs</span><span class="p">())</span>
<span class="k">def</span> <span class="nf">get_form_kwargs</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">"""Return the keyword arguments for instantiating the form."""</span>
<span class="n">kwargs</span> <span class="o">=</span> <span class="p">{</span>
<span class="s1">'initial'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_initial</span><span class="p">(),</span>
<span class="s1">'prefix'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_prefix</span><span class="p">(),</span>
<span class="p">}</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">method</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">'POST'</span><span class="p">,</span> <span class="s1">'PUT'</span><span class="p">):</span>
<span class="n">kwargs</span><span class="o">.</span><span class="n">update</span><span class="p">({</span>
<span class="s1">'data'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">POST</span><span class="p">,</span>
<span class="s1">'files'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">FILES</span><span class="p">,</span>
<span class="p">})</span>
<span class="k">return</span> <span class="n">kwargs</span>
<span class="k">def</span> <span class="nf">get_success_url</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">"""Return the URL to redirect to after processing a valid form."""</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">success_url</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">ImproperlyConfigured</span><span class="p">(</span><span class="s2">"No URL to redirect to. Provide a success_url."</span><span class="p">)</span>
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">success_url</span><span class="p">)</span> <span class="c1"># success_url may be lazy</span>
<span class="k">def</span> <span class="nf">form_valid</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">form</span><span class="p">):</span>
<span class="sd">"""If the form is valid, redirect to the supplied URL."""</span>
<span class="k">return</span> <span class="n">HttpResponseRedirect</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">get_success_url</span><span class="p">())</span>
<span class="k">def</span> <span class="nf">form_invalid</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">form</span><span class="p">):</span>
<span class="sd">"""If the form is invalid, render the invalid form."""</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">render_to_response</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">get_context_data</span><span class="p">(</span><span class="n">form</span><span class="o">=</span><span class="n">form</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">get_context_data</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="sd">"""Insert the form into the context dict."""</span>
<span class="k">if</span> <span class="s1">'form'</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">:</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s1">'form'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_form</span><span class="p">()</span>
<span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get_context_data</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">ModelFormMixin</span><span class="p">(</span><span class="n">FormMixin</span><span class="p">,</span> <span class="n">SingleObjectMixin</span><span class="p">):</span>
<span class="sd">"""Provide a way to show and handle a ModelForm in a request."""</span>
<span class="n">fields</span> <span class="o">=</span> <span class="bp">None</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">get_form_class</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">"""Return the form class to use in this view."""</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">fields</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">form_class</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">ImproperlyConfigured</span><span class="p">(</span>
<span class="s2">"Specifying both 'fields' and 'form_class' is not permitted."</span>
<span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">form_class</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">form_class</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
<span class="c1"># If a model has been explicitly provided, use it</span>
<span class="n">model</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span>
<span class="k">elif</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">'object'</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
<span class="c1"># If this view is operating on a single object, use</span>
<span class="c1"># the class of that object</span>
<span class="n">model</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">object</span><span class="o">.</span><span class="vm">__class__</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># Try to get a queryset and extract the model class</span>
<span class="c1"># from that</span>
<span class="n">model</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_queryset</span><span class="p">()</span><span class="o">.</span><span class="n">model</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">fields</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">ImproperlyConfigured</span><span class="p">(</span>
<span class="s2">"Using ModelFormMixin (base class of </span><span class="si">%s</span><span class="s2">) without "</span>
<span class="s2">"the 'fields' attribute is prohibited."</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span>
<span class="p">)</span>
<span class="k">return</span> <span class="n">model_forms</span><span class="o">.</span><span class="n">modelform_factory</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">fields</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">fields</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">get_form_kwargs</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">"""Return the keyword arguments for instantiating the form."""</span>
<span class="n">kwargs</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get_form_kwargs</span><span class="p">()</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">'object'</span><span class="p">):</span>
<span class="n">kwargs</span><span class="o">.</span><span class="n">update</span><span class="p">({</span><span class="s1">'instance'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">object</span><span class="p">})</span>
<span class="k">return</span> <span class="n">kwargs</span>
<span class="k">def</span> <span class="nf">get_success_url</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">"""Return the URL to redirect to after processing a valid form."""</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">success_url</span><span class="p">:</span>
<span class="n">url</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">success_url</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">object</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">url</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">object</span><span class="o">.</span><span class="n">get_absolute_url</span><span class="p">()</span>
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">ImproperlyConfigured</span><span class="p">(</span>
<span class="s2">"No URL to redirect to. Either provide a url or define"</span>
<span class="s2">" a get_absolute_url method on the Model."</span><span class="p">)</span>
<span class="k">return</span> <span class="n">url</span>
<span class="k">def</span> <span class="nf">form_valid</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">form</span><span class="p">):</span>
<span class="sd">"""If the form is valid, save the associated model."""</span>
<span class="bp">self</span><span class="o">.</span><span class="n">object</span> <span class="o">=</span> <span class="n">form</span><span class="o">.</span><span class="n">save</span><span class="p">()</span>
<span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">form_valid</span><span class="p">(</span><span class="n">form</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">ProcessFormView</span><span class="p">(</span><span class="n">View</span><span class="p">):</span>
<span class="sd">"""Render a form on GET and processes it on POST."""</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="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="sd">"""Handle GET requests: instantiate a blank version of the form."""</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">render_to_response</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">get_context_data</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="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="sd">"""</span>
<span class="sd"> Handle POST requests: instantiate a form instance with the passed</span>
<span class="sd"> POST variables and then check if it's valid.</span>
<span class="sd"> """</span>
<span class="n">form</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_form</span><span class="p">()</span>
<span class="k">if</span> <span class="n">form</span><span class="o">.</span><span class="n">is_valid</span><span class="p">():</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">form_valid</span><span class="p">(</span><span class="n">form</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">form_invalid</span><span class="p">(</span><span class="n">form</span><span class="p">)</span>
<span class="c1"># PUT is a valid HTTP verb for creating (with a known URL) or editing an</span>
<span class="c1"># object, note that browsers only support POST for now.</span>
<span class="k">def</span> <span class="nf">put</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">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">post</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">class</span> <span class="nc">BaseFormView</span><span class="p">(</span><span class="n">FormMixin</span><span class="p">,</span> <span class="n">ProcessFormView</span><span class="p">):</span>
<span class="sd">"""A base view for displaying a form."""</span>
<span class="k">class</span> <span class="nc">FormView</span><span class="p">(</span><span class="n">TemplateResponseMixin</span><span class="p">,</span> <span class="n">BaseFormView</span><span class="p">):</span>
<span class="sd">"""A view for displaying a form and rendering a template response."""</span>
<span class="k">class</span> <span class="nc">BaseCreateView</span><span class="p">(</span><span class="n">ModelFormMixin</span><span class="p">,</span> <span class="n">ProcessFormView</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Base view for creating a new object instance.</span>
<span class="sd"> Using this base class requires subclassing to provide a response mixin.</span>
<span class="sd"> """</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="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="bp">self</span><span class="o">.</span><span class="n">object</span> <span class="o">=</span> <span class="bp">None</span>
<span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">request</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="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="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="bp">self</span><span class="o">.</span><span class="n">object</span> <span class="o">=</span> <span class="bp">None</span>
<span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="n">request</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">class</span> <span class="nc">CreateView</span><span class="p">(</span><span class="n">SingleObjectTemplateResponseMixin</span><span class="p">,</span> <span class="n">BaseCreateView</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> View for creating a new object, with a response rendered by a template.</span>
<span class="sd"> """</span>
<span class="n">template_name_suffix</span> <span class="o">=</span> <span class="s1">'_form'</span>
<span class="k">class</span> <span class="nc">BaseUpdateView</span><span class="p">(</span><span class="n">ModelFormMixin</span><span class="p">,</span> <span class="n">ProcessFormView</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Base view for updating an existing object.</span>
<span class="sd"> Using this base class requires subclassing to provide a response mixin.</span>
<span class="sd"> """</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="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="bp">self</span><span class="o">.</span><span class="n">object</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_object</span><span class="p">()</span>
<span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">request</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="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="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="bp">self</span><span class="o">.</span><span class="n">object</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_object</span><span class="p">()</span>
<span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="n">request</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">class</span> <span class="nc">UpdateView</span><span class="p">(</span><span class="n">SingleObjectTemplateResponseMixin</span><span class="p">,</span> <span class="n">BaseUpdateView</span><span class="p">):</span>
<span class="sd">"""View for updating an object, with a response rendered by a template."""</span>
<span class="n">template_name_suffix</span> <span class="o">=</span> <span class="s1">'_form'</span>
<span class="k">class</span> <span class="nc">DeletionMixin</span><span class="p">:</span>
<span class="sd">"""Provide the ability to delete objects."""</span>
<span class="n">success_url</span> <span class="o">=</span> <span class="bp">None</span>
<span class="k">def</span> <span class="nf">delete</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="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="sd">"""</span>
<span class="sd"> Call the delete() method on the fetched object and then redirect to the</span>
<span class="sd"> success URL.</span>
<span class="sd"> """</span>
<span class="bp">self</span><span class="o">.</span><span class="n">object</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_object</span><span class="p">()</span>
<span class="n">success_url</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_success_url</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">object</span><span class="o">.</span><span class="n">delete</span><span class="p">()</span>
<span class="k">return</span> <span class="n">HttpResponseRedirect</span><span class="p">(</span><span class="n">success_url</span><span class="p">)</span>
<span class="c1"># Add support for browsers which only accept GET and POST for now.</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="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">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">delete</span><span class="p">(</span><span class="n">request</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="nf">get_success_url</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">success_url</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">success_url</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">object</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">ImproperlyConfigured</span><span class="p">(</span>
<span class="s2">"No URL to redirect to. Provide a success_url."</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">BaseDeleteView</span><span class="p">(</span><span class="n">DeletionMixin</span><span class="p">,</span> <span class="n">BaseDetailView</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Base view for deleting an object.</span>
<span class="sd"> Using this base class requires subclassing to provide a response mixin.</span>
<span class="sd"> """</span>
<span class="k">class</span> <span class="nc">DeleteView</span><span class="p">(</span><span class="n">SingleObjectTemplateResponseMixin</span><span class="p">,</span> <span class="n">BaseDeleteView</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> View for deleting an object retrieved with self.get_object(), with a</span>
<span class="sd"> response rendered by a template.</span>
<span class="sd"> """</span>
<span class="n">template_name_suffix</span> <span class="o">=</span> <span class="s1">'_confirm_delete'</span>
</pre></div><br/>Файл models.py <br/><div class="code"><pre>[code html]<br/>from django.core.exceptions import ImproperlyConfigured<br/>from django.forms import models as model_forms<br/>from django.http import HttpResponseRedirect<br/>from django.views.generic.base import ContextMixin, TemplateResponseMixin, View<br/>from django.views.generic.detail import (<br/> BaseDetailView, SingleObjectMixin, SingleObjectTemplateResponseMixin,<br/>)<br/><br/><br/>class FormMixin(ContextMixin):<br/> """Provide a way to show and handle a form in a request."""<br/> initial = {}<br/> form_class = None<br/> success_url = None<br/> prefix = None<br/><br/> def get_initial(self):<br/> """Return the initial data to use for forms on this view."""<br/> return self.initial.copy()<br/><br/> def get_prefix(self):<br/> """Return the prefix to use for forms."""<br/> return self.prefix<br/><br/> def get_form_class(self):<br/> """Return the form class to use."""<br/> return self.form_class<br/><br/> def get_form(self, form_class=None):<br/> """Return an instance of the form to be used in this view."""<br/> if form_class is None:<br/> form_class = self.get_form_class()<br/> return form_class (**self.get_form_kwargs())<br/><br/> def get_form_kwargs(self):<br/> """Return the keyword arguments for instantiating the form."""<br/> kwargs = {<br/> 'initial': self.get_initial(),<br/> 'prefix': self.get_prefix(),<br/> }<br/><br/> if self.request.method in ('POST', 'PUT'):<br/> kwargs.update({<br/> 'data': self.request.POST,<br/> 'files': self.request.FILES,<br/> })<br/> return kwargs<br/><br/> def get_success_url(self):<br/> """Return the URL to redirect to after processing a valid form."""<br/> if not self.success_url:<br/> raise ImproperlyConfigured("No URL to redirect to. Provide a success_url.")<br/> return str(self.success_url) # success_url may be lazy<br/><br/> def form_valid(self, form):<br/> """If the form is valid, redirect to the supplied URL."""<br/> return HttpResponseRedirect(self.get_success_url())<br/><br/> def form_invalid(self, form):<br/> """If the form is invalid, render the invalid form."""<br/> return self.render_to_response(self.get_context_data(form=form))<br/><br/> def get_context_data(self, **kwargs):<br/> """Insert the form into the context dict."""<br/> if 'form' not in kwargs:<br/> kwargs['form'] = self.get_form()<br/> return super().get_context_data(**kwargs)<br/><br/><br/>class ModelFormMixin(FormMixin, SingleObjectMixin):<br/> """Provide a way to show and handle a ModelForm in a request."""<br/> fields = None<br/><br/> @property<br/> def get_form_class(self):<br/> """Return the form class to use in this view."""<br/> if self.fields is not None and self.form_class:<br/> raise ImproperlyConfigured(<br/> "Specifying both 'fields' and 'form_class' is not permitted."<br/> )<br/> if self.form_class:<br/> return self.form_class<br/> else:<br/> if self.model is not None:<br/> # If a model has been explicitly provided, use it<br/> model = self.model<br/> elif getattr(self, 'object', None) is not None:<br/> # If this view is operating on a single object, use<br/> # the class of that object<br/> model = self.object.__class__<br/> else:<br/> # Try to get a queryset and extract the model class<br/> # from that<br/> model = self.get_queryset().model<br/><br/> if self.fields is None:<br/> raise ImproperlyConfigured(<br/> "Using ModelFormMixin (base class of %s) without "<br/> "the 'fields' attribute is prohibited." % self.__class__.__name__<br/> )<br/><br/> return model_forms.modelform_factory(model, fields=self.fields)<br/><br/> def get_form_kwargs(self):<br/> """Return the keyword arguments for instantiating the form."""<br/> kwargs = super().get_form_kwargs()<br/> if hasattr(self, 'object'):<br/> kwargs.update({'instance': self.object})<br/> return kwargs<br/><br/> def get_success_url(self):<br/> """Return the URL to redirect to after processing a valid form."""<br/> if self.success_url:<br/> url = self.success_url.format(**self.object.__dict__)<br/> else:<br/> try:<br/> url = self.object.get_absolute_url()<br/> except AttributeError:<br/> raise ImproperlyConfigured(<br/> "No URL to redirect to. Either provide a url or define"<br/> " a get_absolute_url method on the Model.")<br/> return url<br/><br/> def form_valid(self, form):<br/> """If the form is valid, save the associated model."""<br/> self.object = form.save()<br/> return super().form_valid(form)<br/><br/><br/>class ProcessFormView(View):<br/> """Render a form on GET and processes it on POST."""<br/> def get(self, request, *args, **kwargs):<br/> """Handle GET requests: instantiate a blank version of the form."""<br/> return self.render_to_response(self.get_context_data())<br/><br/> def post(self, request, *args, **kwargs):<br/> """<br/> Handle POST requests: instantiate a form instance with the passed<br/> POST variables and then check if it's valid.<br/> """<br/> form = self.get_form()<br/> if form.is_valid():<br/> return self.form_valid(form)<br/> else:<br/> return self.form_invalid(form)<br/><br/> # PUT is a valid HTTP verb for creating (with a known URL) or editing an<br/> # object, note that browsers only support POST for now.<br/> def put(self, *args, **kwargs):<br/> return self.post(*args, **kwargs)<br/><br/><br/>class BaseFormView(FormMixin, ProcessFormView):<br/> """A base view for displaying a form."""<br/><br/><br/>class FormView(TemplateResponseMixin, BaseFormView):<br/> """A view for displaying a form and rendering a template response."""<br/><br/><br/>class BaseCreateView(ModelFormMixin, ProcessFormView):<br/> """<br/> Base view for creating a new object instance.<br/><br/> Using this base class requires subclassing to provide a response mixin.<br/> """<br/> def get(self, request, *args, **kwargs):<br/> self.object = None<br/> return super().get(request, *args, **kwargs)<br/><br/> def post(self, request, *args, **kwargs):<br/> self.object = None<br/> return super().post(request, *args, **kwargs)<br/><br/><br/>class CreateView(SingleObjectTemplateResponseMixin, BaseCreateView):<br/> """<br/> View for creating a new object, with a response rendered by a template.<br/> """<br/> template_name_suffix = '_form'<br/><br/><br/>class BaseUpdateView(ModelFormMixin, ProcessFormView):<br/> """<br/> Base view for updating an existing object.<br/><br/> Using this base class requires subclassing to provide a response mixin.<br/> """<br/> def get(self, request, *args, **kwargs):<br/> self.object = self.get_object()<br/> return super().get(request, *args, **kwargs)<br/><br/> def post(self, request, *args, **kwargs):<br/> self.object = self.get_object()<br/> return super().post(request, *args, **kwargs)<br/><br/><br/>class UpdateView(SingleObjectTemplateResponseMixin, BaseUpdateView):<br/> """View for updating an object, with a response rendered by a template."""<br/> template_name_suffix = '_form'<br/><br/><br/>class DeletionMixin:<br/> """Provide the ability to delete objects."""<br/> success_url = None<br/><br/> def delete(self, request, *args, **kwargs):<br/> """<br/> Call the delete() method on the fetched object and then redirect to the<br/> success URL.<br/> """<br/> self.object = self.get_object()<br/> success_url = self.get_success_url()<br/> self.object.delete()<br/> return HttpResponseRedirect(success_url)<br/><br/> # Add support for browsers which only accept GET and POST for now.<br/> def post(self, request, *args, **kwargs):<br/> return self.delete(request, *args, **kwargs)<br/><br/> def get_success_url(self):<br/> if self.success_url:<br/> return self.success_url.format(**self.object.__dict__)<br/> else:<br/> raise ImproperlyConfigured(<br/> "No URL to redirect to. Provide a success_url.")<br/><br/><br/>class BaseDeleteView(DeletionMixin, BaseDetailView):<br/> """<br/> Base view for deleting an object.<br/><br/> Using this base class requires subclassing to provide a response mixin.<br/> """<br/><br/><br/>class DeleteView(SingleObjectTemplateResponseMixin, BaseDeleteView):<br/> """<br/> View for deleting an object retrieved with self.get_object(), with a<br/> response rendered by a template.<br/> """<br/> template_name_suffix = '_confirm_delete'<br/>[/code]</pre></div><br/>Файл urls.py <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="kn">from</span> <span class="nn">.views</span> <span class="kn">import</span> <span class="n">index</span><span class="p">,</span> <span class="n">by_rubric</span>
<span class="kn">from</span> <span class="nn">.views</span> <span class="kn">import</span> <span class="n">BbCreateView</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">'<int:rubric_id>/'</span><span class="p">,</span> <span class="n">by_rubric</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s1">'by_rubric'</span> <span class="p">),</span>
<span class="n">path</span><span class="p">(</span> <span class="s1">'add/'</span><span class="p">,</span> <span class="n">BbCreateView</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">'add'</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">index</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s1">'index'</span> <span class="p">),</span>
<span class="p">]</span>
</pre></div>