-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge remote-tracking branch 'origin/gh-pages'
- Loading branch information
Showing
9 changed files
with
727 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
aliev.me |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,71 @@ | ||
<!DOCTYPE html> | ||
<html lang="en"> | ||
<head> | ||
<link rel="stylesheet" href="../static/style.css"> | ||
<link rel="stylesheet" href="../static/pygments.css"> | ||
<title>Добавляем ошибки в форму минуя метод clean — aliev</title> | ||
</head> | ||
<body> | ||
<main> | ||
<header class="site-header"> | ||
<h1 class="site-title"><a href="/"></a></h1> | ||
<nav class="site-nav"> | ||
|
||
|
||
<a href="../"><-</a> | ||
|
||
|
||
<a href="https://aliev.me.uk" target="_blank">Medium</a> | ||
<a href="https://twitter.com/ali_aliev" target="_blank">Twitter</a> | ||
<a href="http://github.com/aliev" target="_blank">Github</a> | ||
<a href="http://ali.aliev.me" target="_blank">CV</a> | ||
</nav> | ||
</header> | ||
|
||
|
||
<div class="blog-post"> | ||
|
||
<h2>Добавляем ошибки в форму минуя метод clean</h2> | ||
|
||
<p class="meta"> | ||
written by | ||
|
||
<a href="https://twitter.com/ali_aliev">Ali Aliev</a> | ||
|
||
on 2015-06-19 | ||
</p> | ||
<p>Иногда бывает удобно добавлять ошибки полей формы минуя метод clean. Для этого в Django > 1.7 был добавлен новый метод add_error в экземпляр формы. Использовать этот метод легко, достаточно указать в качестве его параметра id поля и сообщение об ошибке, после чего вернуть form_invalid. Пример использования в FormView:</p> | ||
<div class="highlight"><pre><span class="k">class</span> <span class="nc">TestFormView</span><span class="p">(</span><span class="n">FormView</span><span class="p">):</span> | ||
<span class="n">form_class</span> <span class="o">=</span> <span class="n">TestForm</span> | ||
<span class="n">template_name</span> <span class="o">=</span> <span class="s">'test/form.html'</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="n">less_than_one</span> <span class="o">=</span> <span class="n">form</span><span class="o">.</span><span class="n">cleaned_data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">'less_than_one'</span><span class="p">)</span> | ||
<span class="k">if</span> <span class="n">less_than_one</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span> | ||
<span class="n">form</span><span class="o">.</span><span class="n">add_error</span><span class="p">(</span><span class="s">'less_than_one'</span><span class="p">,</span> <span class="n">forms</span><span class="o">.</span><span class="n">ValidationError</span><span class="p">(</span><span class="s">'Can not be greater than one'</span><span class="p">))</span> | ||
<span class="k">return</span> <span class="nb">super</span><span class="p">(</span><span class="n">TestFormView</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</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="k">return</span> <span class="nb">super</span><span class="p">(</span><span class="n">TestFormView</span><span class="p">,</span> <span class="bp">self</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> | ||
</pre></div> | ||
<p>Если по каким то причинам вы не в состоянии обновиться до Django > 1.7, есть вариант воспользоваться следующим приемом:</p> | ||
<div class="highlight"><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">django.forms.forms</span> <span class="kn">import</span> <span class="n">NON_FIELD_ERRORS</span> | ||
|
||
<span class="k">class</span> <span class="nc">AddErrorMixin</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span> | ||
<span class="s">"Backport add_error() for django <1.7"</span> | ||
<span class="k">def</span> <span class="nf">add_error</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">,</span> <span class="n">msg</span><span class="p">):</span> | ||
<span class="n">field</span> <span class="o">=</span> <span class="n">field</span> <span class="ow">or</span> <span class="n">NON_FIELD_ERRORS</span> | ||
<span class="k">if</span> <span class="n">field</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_errors</span><span class="p">:</span> | ||
<span class="bp">self</span><span class="o">.</span><span class="n">_errors</span><span class="p">[</span><span class="n">field</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span> | ||
<span class="k">else</span><span class="p">:</span> | ||
<span class="bp">self</span><span class="o">.</span><span class="n">_errors</span><span class="p">[</span><span class="n">field</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">error_class</span><span class="p">([</span><span class="n">msg</span><span class="p">])</span> | ||
|
||
<span class="k">class</span> <span class="nc">ExampleForm</span><span class="p">(</span><span class="n">AddErrorMixin</span><span class="p">,</span> <span class="n">forms</span><span class="o">.</span><span class="n">Form</span><span class="p">):</span> | ||
<span class="k">pass</span> | ||
</pre></div> | ||
|
||
</div> | ||
|
||
|
||
</main> | ||
</body> | ||
</html> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
<!DOCTYPE html> | ||
<html lang="en"> | ||
<head> | ||
<link rel="stylesheet" href="../static/style.css"> | ||
<link rel="stylesheet" href="../static/pygments.css"> | ||
<title>F выражение в Django ORM — aliev</title> | ||
</head> | ||
<body> | ||
<main> | ||
<header class="site-header"> | ||
<h1 class="site-title"><a href="/"></a></h1> | ||
<nav class="site-nav"> | ||
|
||
|
||
<a href="../"><-</a> | ||
|
||
|
||
<a href="https://aliev.me.uk" target="_blank">Medium</a> | ||
<a href="https://twitter.com/ali_aliev" target="_blank">Twitter</a> | ||
<a href="http://github.com/aliev" target="_blank">Github</a> | ||
<a href="http://ali.aliev.me" target="_blank">CV</a> | ||
</nav> | ||
</header> | ||
|
||
|
||
<div class="blog-post"> | ||
|
||
<h2>F выражение в Django ORM</h2> | ||
|
||
<p class="meta"> | ||
written by | ||
|
||
<a href="https://twitter.com/ali_aliev">Ali Aliev</a> | ||
|
||
on 2015-06-03 | ||
</p> | ||
<p>Выражение F() в Django ORM позволит вам использовать поля текущей модели в ваших запросах. | ||
Например, вы хотите увеличить значение поля на единицу, на ум приходит следующий код:</p> | ||
<div class="highlight"><pre><span class="n">article</span> <span class="o">=</span> <span class="n">Article</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="mi">1</span><span class="p">)</span> | ||
<span class="n">article</span><span class="o">.</span><span class="n">count</span> <span class="o">+=</span> <span class="mi">1</span> | ||
<span class="n">article</span><span class="o">.</span><span class="n">save</span><span class="p">()</span> | ||
</pre></div> | ||
<p>Но данный код можно реализовать более элегантным способом:</p> | ||
<div class="highlight"><pre><span class="n">Article</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">pk</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">count</span><span class="o">=</span><span class="n">F</span><span class="p">(</span><span class="s">'count'</span><span class="p">)</span> <span class="o">+</span> <span class="mi">5</span><span class="p">)</span> | ||
</pre></div> | ||
<p>Более практичный пример, сравнивать поля текущей модели.</p> | ||
<div class="highlight"><pre><span class="n">In</span> <span class="p">[</span><span class="mi">2</span><span class="p">]:</span> <span class="n">Article</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">count</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">number_of_likes</span><span class="o">=</span><span class="mi">10</span><span class="p">)</span> | ||
<span class="n">Out</span><span class="p">[</span><span class="mi">2</span><span class="p">]:</span> <span class="o"><</span><span class="n">Article</span><span class="p">:</span> <span class="n">Article</span> <span class="nb">object</span><span class="o">></span> | ||
</pre></div> | ||
<p>Попробуем сделать сравнение</p> | ||
<div class="highlight"><pre><span class="n">In</span> <span class="p">[</span><span class="mi">3</span><span class="p">]:</span> <span class="kn">from</span> <span class="nn">django.db.models</span> <span class="kn">import</span> <span class="n">F</span> | ||
|
||
<span class="n">In</span> <span class="p">[</span><span class="mi">4</span><span class="p">]:</span> <span class="n">Article</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">number_of_likes__gte</span><span class="o">=</span><span class="n">F</span><span class="p">(</span><span class="s">'count'</span><span class="p">))</span> | ||
<span class="n">Out</span><span class="p">[</span><span class="mi">4</span><span class="p">]:</span> <span class="p">[</span><span class="o"><</span><span class="n">Article</span><span class="p">:</span> <span class="n">Article</span> <span class="nb">object</span><span class="o">></span><span class="p">]</span> | ||
</pre></div> | ||
<p>Посмотрим какой SQL запрос был сгенерирован</p> | ||
<div class="highlight"><pre><span class="n">In</span> <span class="p">[</span><span class="mi">5</span><span class="p">]:</span> <span class="k">print</span> <span class="n">Article</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">number_of_likes__gte</span><span class="o">=</span><span class="n">F</span><span class="p">(</span><span class="s">'count'</span><span class="p">))</span><span class="o">.</span><span class="n">query</span> | ||
<span class="n">SELECT</span> <span class="s">"example_article"</span><span class="o">.</span><span class="s">"id"</span><span class="p">,</span> <span class="s">"example_article"</span><span class="o">.</span><span class="s">"content"</span><span class="p">,</span> <span class="s">"example_article"</span><span class="o">.</span><span class="s">"count"</span><span class="p">,</span> <span class="s">"example_article"</span><span class="o">.</span><span class="s">"number_of_likes"</span> <span class="n">FROM</span> <span class="s">"example_article"</span> <span class="n">WHERE</span> <span class="s">"example_article"</span><span class="o">.</span><span class="s">"number_of_likes"</span> <span class="o">>=</span> <span class="p">(</span><span class="s">"example_article"</span><span class="o">.</span><span class="s">"count"</span><span class="p">)</span> | ||
</pre></div> | ||
<p>Если вам интересно узнать как работают F выражения изнутри советую прочитать старенькую статью <a href="http://softwaremaniacs.org/blog/2008/11/21/expressions-in-django-queries/">Ивана Сагалаева.</a></p> | ||
|
||
</div> | ||
|
||
|
||
</main> | ||
</body> | ||
</html> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,114 @@ | ||
<!DOCTYPE html> | ||
<html lang="en"> | ||
<head> | ||
<link rel="stylesheet" href="./static/style.css"> | ||
<link rel="stylesheet" href="./static/pygments.css"> | ||
<title> — aliev</title> | ||
</head> | ||
<body> | ||
<main> | ||
<header class="site-header"> | ||
<h1 class="site-title"><a href="/"></a></h1> | ||
<nav class="site-nav"> | ||
|
||
|
||
|
||
<a href="https://aliev.me.uk" target="_blank">Medium</a> | ||
<a href="https://twitter.com/ali_aliev" target="_blank">Twitter</a> | ||
<a href="http://github.com/aliev" target="_blank">Github</a> | ||
<a href="http://ali.aliev.me" target="_blank">CV</a> | ||
</nav> | ||
</header> | ||
|
||
|
||
|
||
<div class="blog-post"> | ||
|
||
<h2><a href="./upravlenie-tranzakciyami-v-django/">Управление транзакциями в Django</a></h2> | ||
|
||
<p class="meta"> | ||
written by | ||
|
||
<a href="https://twitter.com/ali_aliev">Ali Aliev</a> | ||
|
||
on 2016-05-19 | ||
</p> | ||
</div> | ||
|
||
|
||
|
||
<div class="blog-post"> | ||
|
||
<h2><a href="./neskolko-poleznyh-praktik-ispolzovaniya-zaprosov-v-django-orm/">Несколько полезных практик использования запросов в Django ORM</a></h2> | ||
|
||
<p class="meta"> | ||
written by | ||
|
||
<a href="https://twitter.com/ali_aliev">Ali Aliev</a> | ||
|
||
on 2015-06-21 | ||
</p> | ||
</div> | ||
|
||
|
||
|
||
<div class="blog-post"> | ||
|
||
<h2><a href="./dobavlyaem-oshibki-v-formu-minuya-metod-clean/">Добавляем ошибки в форму минуя метод clean</a></h2> | ||
|
||
<p class="meta"> | ||
written by | ||
|
||
<a href="https://twitter.com/ali_aliev">Ali Aliev</a> | ||
|
||
on 2015-06-19 | ||
</p> | ||
</div> | ||
|
||
|
||
|
||
<div class="blog-post"> | ||
|
||
<h2><a href="./prosto-o-django-content-types-framework/">Просто о Django Content Types Framework</a></h2> | ||
|
||
<p class="meta"> | ||
written by | ||
|
||
<a href="https://twitter.com/ali_aliev">Ali Aliev</a> | ||
|
||
on 2015-06-04 | ||
</p> | ||
</div> | ||
|
||
|
||
|
||
<div class="blog-post"> | ||
|
||
<h2><a href="./f-vyrazhenie-v-django-orm/">F выражение в Django ORM</a></h2> | ||
|
||
<p class="meta"> | ||
written by | ||
|
||
<a href="https://twitter.com/ali_aliev">Ali Aliev</a> | ||
|
||
on 2015-06-03 | ||
</p> | ||
</div> | ||
|
||
|
||
|
||
|
||
<div class="pagination"> | ||
|
||
<span class="disabled">« Previous</span> | ||
|
||
| 1 | | ||
|
||
<span class="disabled">Next »</span> | ||
|
||
</div> | ||
|
||
|
||
</main> | ||
</body> | ||
</html> |
Oops, something went wrong.