Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/gh-pages'
Browse files Browse the repository at this point in the history
  • Loading branch information
aliev committed Mar 19, 2016
2 parents f93caaf + 74ac028 commit 5b419de
Show file tree
Hide file tree
Showing 9 changed files with 727 additions and 0 deletions.
1 change: 1 addition & 0 deletions CNAME
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
aliev.me
71 changes: 71 additions & 0 deletions dobavlyaem-oshibki-v-formu-minuya-metod-clean/index.html
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 &gt; 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">&#39;test/form.html&#39;</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">&#39;less_than_one&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">less_than_one</span> <span class="o">&gt;</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">&#39;less_than_one&#39;</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">&#39;Can not be greater than one&#39;</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 &gt; 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">&quot;Backport add_error() for django &lt;1.7&quot;</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>
67 changes: 67 additions & 0 deletions f-vyrazhenie-v-django-orm/index.html
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">&#39;count&#39;</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">&lt;</span><span class="n">Article</span><span class="p">:</span> <span class="n">Article</span> <span class="nb">object</span><span class="o">&gt;</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">&#39;count&#39;</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">&lt;</span><span class="n">Article</span><span class="p">:</span> <span class="n">Article</span> <span class="nb">object</span><span class="o">&gt;</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">&#39;count&#39;</span><span class="p">))</span><span class="o">.</span><span class="n">query</span>
<span class="n">SELECT</span> <span class="s">&quot;example_article&quot;</span><span class="o">.</span><span class="s">&quot;id&quot;</span><span class="p">,</span> <span class="s">&quot;example_article&quot;</span><span class="o">.</span><span class="s">&quot;content&quot;</span><span class="p">,</span> <span class="s">&quot;example_article&quot;</span><span class="o">.</span><span class="s">&quot;count&quot;</span><span class="p">,</span> <span class="s">&quot;example_article&quot;</span><span class="o">.</span><span class="s">&quot;number_of_likes&quot;</span> <span class="n">FROM</span> <span class="s">&quot;example_article&quot;</span> <span class="n">WHERE</span> <span class="s">&quot;example_article&quot;</span><span class="o">.</span><span class="s">&quot;number_of_likes&quot;</span> <span class="o">&gt;=</span> <span class="p">(</span><span class="s">&quot;example_article&quot;</span><span class="o">.</span><span class="s">&quot;count&quot;</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>
114 changes: 114 additions & 0 deletions index.html
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">&laquo; Previous</span>

| 1 |

<span class="disabled">Next &raquo;</span>

</div>


</main>
</body>
</html>
Loading

0 comments on commit 5b419de

Please sign in to comment.