Updated HTML docs

This commit is contained in:
Griatch 2021-10-26 21:41:11 +02:00
parent 66d0ad0bc9
commit 7900aad365
2073 changed files with 32986 additions and 41197 deletions

View file

@ -14,6 +14,8 @@
<script src="../_static/underscore.js"></script>
<script src="../_static/doctools.js"></script>
<script src="../_static/language_data.js"></script>
<script async="async" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.7/latest.js?config=TeX-AMS-MML_HTMLorMML"></script>
<script type="text/x-mathjax-config">MathJax.Hub.Config({"tex2jax": {"processClass": "tex2jax_process|mathjax_process|math|output_area"}})</script>
<link rel="shortcut icon" href="../_static/favicon.ico"/>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
@ -38,7 +40,7 @@
<div class="bodywrapper">
<div class="body" role="main">
<section id="web-character-generation">
<section class="tex2jax_ignore mathjax_ignore" id="web-character-generation">
<h1>Web Character Generation<a class="headerlink" href="#web-character-generation" title="Permalink to this headline"></a></h1>
<section id="introduction">
<h2>Introduction<a class="headerlink" href="#introduction" title="Permalink to this headline"></a></h2>
@ -85,7 +87,7 @@ you see it listed:</p>
<section id="installing-an-app">
<h2>Installing an App<a class="headerlink" href="#installing-an-app" title="Permalink to this headline"></a></h2>
<p>Assuming your game is named “mygame”, navigate to your <code class="docutils literal notranslate"><span class="pre">mygame/</span></code> directory, and type:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">evennia</span> <span class="n">startapp</span> <span class="n">chargen</span>
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>evennia startapp chargen
</pre></div>
</div>
<p>This will initialize a new Django app we choose to call “chargen”. It is directory containing some
@ -94,7 +96,7 @@ in your <code class="docutils literal notranslate"><span class="pre">mygame</spa
<code class="docutils literal notranslate"><span class="pre">mygame/web/chargen</span></code> in the end.</p>
<p>Next, navigate to <code class="docutils literal notranslate"><span class="pre">mygame/server/conf/settings.py</span></code> and add or edit the following line to make
Evennia (and Django) aware of our new app:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">INSTALLED_APPS</span> <span class="o">+=</span> <span class="p">(</span><span class="s1">&#39;web.chargen&#39;</span><span class="p">,)</span>
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>INSTALLED_APPS += (&#39;web.chargen&#39;,)
</pre></div>
</div>
<p>After this, we will get into defining our <em>models</em> (the description of the database storage),
@ -104,14 +106,14 @@ and <em>templates</em> (how the web page should be structured).</p>
<h3>Installing - Checkpoint:<a class="headerlink" href="#installing-checkpoint" title="Permalink to this headline"></a></h3>
<ul class="simple">
<li><p>you should have a folder named <code class="docutils literal notranslate"><span class="pre">chargen</span></code> or whatever you chose in your mygame/web/ directory</p></li>
<li><p>you should have your application name added to your INSTALLED_APPS in settings.py</p></li>
<li><p>you should have your application name added to your INSTALLED_APPS in <a class="reference external" href="http://settings.py">settings.py</a></p></li>
</ul>
</section>
</section>
<section id="create-models">
<h2>Create Models<a class="headerlink" href="#create-models" title="Permalink to this headline"></a></h2>
<p>Models are created in <code class="docutils literal notranslate"><span class="pre">mygame/web/chargen/models.py</span></code>.</p>
<p>A <a class="reference internal" href="../Concepts/New-Models.html"><span class="doc">Django database model</span></a> is a Python class that describes the database storage of the
<p>A <a class="reference internal" href="../Concepts/New-Models.html"><span class="doc std std-doc">Django database model</span></a> is a Python class that describes the database storage of the
data you want to manage. Any data you choose to store is stored in the same database as the game and
you have access to all the games objects here.</p>
<p>We need to define what a character application actually is. This will differ from game to game so
@ -130,17 +132,7 @@ AccountID from the AccountDB object.</p></li>
attributes and so on.</p>
</div></blockquote>
<p>Our <code class="docutils literal notranslate"><span class="pre">models.py</span></code> file should look something like this:</p>
<div class="highlight-python notranslate"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal"> 1</span>
<span class="normal"> 2</span>
<span class="normal"> 3</span>
<span class="normal"> 4</span>
<span class="normal"> 5</span>
<span class="normal"> 6</span>
<span class="normal"> 7</span>
<span class="normal"> 8</span>
<span class="normal"> 9</span>
<span class="normal">10</span>
<span class="normal">11</span></pre></div></td><td class="code"><div class="highlight"><pre><span></span><span class="c1"># in mygame/web/chargen/models.py</span>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># in mygame/web/chargen/models.py</span>
<span class="kn">from</span> <span class="nn">django.db</span> <span class="kn">import</span> <span class="n">models</span>
@ -152,7 +144,7 @@ attributes and so on.</p>
<span class="n">account_id</span> <span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">IntegerField</span><span class="p">(</span><span class="n">default</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">verbose_name</span><span class="o">=</span><span class="s1">&#39;Account ID&#39;</span><span class="p">)</span>
<span class="n">submitted</span> <span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">BooleanField</span><span class="p">(</span><span class="n">default</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
</pre></div>
</td></tr></table></div>
</div>
<p>You should consider how you are going to link your application to your account. For this tutorial,
we are using the account_id attribute on our character application model in order to keep track of
which characters are owned by which accounts. Since the account id is a primary key in Evennia, it
@ -183,18 +175,7 @@ given Character.</p></li>
<h3><em>Index</em> view<a class="headerlink" href="#index-view" title="Permalink to this headline"></a></h3>
<p>Lets get started with the index first.</p>
<p>Well want characters to be able to see their created characters so lets</p>
<div class="highlight-python notranslate"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal"> 1</span>
<span class="normal"> 2</span>
<span class="normal"> 3</span>
<span class="normal"> 4</span>
<span class="normal"> 5</span>
<span class="normal"> 6</span>
<span class="normal"> 7</span>
<span class="normal"> 8</span>
<span class="normal"> 9</span>
<span class="normal">10</span>
<span class="normal">11</span>
<span class="normal">12</span></pre></div></td><td class="code"><div class="highlight"><pre><span></span><span class="c1"># file mygame/web/chargen.views.py</span>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># file mygame/web/chargen.views.py</span>
<span class="kn">from</span> <span class="nn">.models</span> <span class="kn">import</span> <span class="n">CharApp</span>
@ -207,7 +188,7 @@ given Character.</p></li>
<span class="c1"># make the variables in &#39;context&#39; available to the web page template</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">&#39;chargen/index.html&#39;</span><span class="p">,</span> <span class="n">context</span><span class="p">)</span>
</pre></div>
</td></tr></table></div>
</div>
</section>
<section id="detail-view">
<h3><em>Detail</em> view<a class="headerlink" href="#detail-view" title="Permalink to this headline"></a></h3>
@ -219,17 +200,7 @@ is a basic demonstration, our detail page will only show two fields:</p>
</ul>
<p>We will use the account ID again just to double-check that whoever tries to check our character page
is actually the account who owns the application.</p>
<div class="highlight-python notranslate"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal"> 1</span>
<span class="normal"> 2</span>
<span class="normal"> 3</span>
<span class="normal"> 4</span>
<span class="normal"> 5</span>
<span class="normal"> 6</span>
<span class="normal"> 7</span>
<span class="normal"> 8</span>
<span class="normal"> 9</span>
<span class="normal">10</span>
<span class="normal">11</span></pre></div></td><td class="code"><div class="highlight"><pre><span></span><span class="c1"># file mygame/web/chargen.views.py</span>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># file mygame/web/chargen.views.py</span>
<span class="k">def</span> <span class="nf">detail</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">app_id</span><span class="p">):</span>
<span class="n">app</span> <span class="o">=</span> <span class="n">CharApp</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">app_id</span><span class="o">=</span><span class="n">app_id</span><span class="p">)</span>
@ -237,11 +208,11 @@ is actually the account who owns the application.</p>
<span class="n">background</span> <span class="o">=</span> <span class="n">app</span><span class="o">.</span><span class="n">background</span>
<span class="n">submitted</span> <span class="o">=</span> <span class="n">app</span><span class="o">.</span><span class="n">submitted</span>
<span class="n">p_id</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">user</span><span class="o">.</span><span class="n">id</span>
<span class="n">context</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="n">name</span><span class="p">,</span> <span class="s1">&#39;background&#39;</span><span class="p">:</span> <span class="n">background</span><span class="p">,</span>
<span class="n">context</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="n">name</span><span class="p">,</span> <span class="s1">&#39;background&#39;</span><span class="p">:</span> <span class="n">background</span><span class="p">,</span>
<span class="s1">&#39;p_id&#39;</span><span class="p">:</span> <span class="n">p_id</span><span class="p">,</span> <span class="s1">&#39;submitted&#39;</span><span class="p">:</span> <span class="n">submitted</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">&#39;chargen/detail.html&#39;</span><span class="p">,</span> <span class="n">context</span><span class="p">)</span>
</pre></div>
</td></tr></table></div>
</div>
</section>
</section>
<section id="creating-view">
@ -251,13 +222,7 @@ information from the user, validate the information, and send the information to
the form content is validated will actually create a playable Character.</p>
<p>The form itself we will define first. In our simple example we are just looking for the Characters
name and background. This form we create in <code class="docutils literal notranslate"><span class="pre">mygame/web/chargen/forms.py</span></code>:</p>
<div class="highlight-python notranslate"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span>
<span class="normal">2</span>
<span class="normal">3</span>
<span class="normal">4</span>
<span class="normal">5</span>
<span class="normal">6</span>
<span class="normal">7</span></pre></div></td><td class="code"><div class="highlight"><pre><span></span><span class="c1"># file mygame/web/chargen/forms.py</span>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># file mygame/web/chargen/forms.py</span>
<span class="kn">from</span> <span class="nn">django</span> <span class="kn">import</span> <span class="n">forms</span>
@ -265,56 +230,9 @@ name and background. This form we create in <code class="docutils literal notran
<span class="n">name</span> <span class="o">=</span> <span class="n">forms</span><span class="o">.</span><span class="n">CharField</span><span class="p">(</span><span class="n">label</span><span class="o">=</span><span class="s1">&#39;Character Name&#39;</span><span class="p">,</span> <span class="n">max_length</span><span class="o">=</span><span class="mi">80</span><span class="p">)</span>
<span class="n">background</span> <span class="o">=</span> <span class="n">forms</span><span class="o">.</span><span class="n">CharField</span><span class="p">(</span><span class="n">label</span><span class="o">=</span><span class="s1">&#39;Background&#39;</span><span class="p">)</span>
</pre></div>
</td></tr></table></div>
</div>
<p>Now we make use of this form in our view.</p>
<div class="highlight-python notranslate"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal"> 1</span>
<span class="normal"> 2</span>
<span class="normal"> 3</span>
<span class="normal"> 4</span>
<span class="normal"> 5</span>
<span class="normal"> 6</span>
<span class="normal"> 7</span>
<span class="normal"> 8</span>
<span class="normal"> 9</span>
<span class="normal">10</span>
<span class="normal">11</span>
<span class="normal">12</span>
<span class="normal">13</span>
<span class="normal">14</span>
<span class="normal">15</span>
<span class="normal">16</span>
<span class="normal">17</span>
<span class="normal">18</span>
<span class="normal">19</span>
<span class="normal">20</span>
<span class="normal">21</span>
<span class="normal">22</span>
<span class="normal">23</span>
<span class="normal">24</span>
<span class="normal">25</span>
<span class="normal">26</span>
<span class="normal">27</span>
<span class="normal">28</span>
<span class="normal">29</span>
<span class="normal">30</span>
<span class="normal">31</span>
<span class="normal">32</span>
<span class="normal">33</span>
<span class="normal">34</span>
<span class="normal">35</span>
<span class="normal">36</span>
<span class="normal">37</span>
<span class="normal">38</span>
<span class="normal">39</span>
<span class="normal">40</span>
<span class="normal">41</span>
<span class="normal">42</span>
<span class="normal">43</span>
<span class="normal">44</span>
<span class="normal">45</span>
<span class="normal">46</span>
<span class="normal">47</span>
<span class="normal">48</span></pre></div></td><td class="code"><div class="highlight"><pre><span></span><span class="c1"># file mygame/web/chargen/views.py</span>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># file mygame/web/chargen/views.py</span>
<span class="kn">from</span> <span class="nn">web.chargen.models</span> <span class="kn">import</span> <span class="n">CharApp</span>
<span class="kn">from</span> <span class="nn">web.chargen.forms</span> <span class="kn">import</span> <span class="n">AppForm</span>
@ -335,8 +253,8 @@ name and background. This form we create in <code class="docutils literal notran
<span class="n">submitted</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">if</span> <span class="s1">&#39;save&#39;</span> <span class="ow">in</span> <span class="n">request</span><span class="o">.</span><span class="n">POST</span><span class="p">:</span>
<span class="n">submitted</span> <span class="o">=</span> <span class="kc">False</span>
<span class="n">app</span> <span class="o">=</span> <span class="n">CharApp</span><span class="p">(</span><span class="n">char_name</span><span class="o">=</span><span class="n">name</span><span class="p">,</span> <span class="n">background</span><span class="o">=</span><span class="n">background</span><span class="p">,</span>
<span class="n">date_applied</span><span class="o">=</span><span class="n">applied_date</span><span class="p">,</span> <span class="n">account_id</span><span class="o">=</span><span class="n">user</span><span class="o">.</span><span class="n">id</span><span class="p">,</span>
<span class="n">app</span> <span class="o">=</span> <span class="n">CharApp</span><span class="p">(</span><span class="n">char_name</span><span class="o">=</span><span class="n">name</span><span class="p">,</span> <span class="n">background</span><span class="o">=</span><span class="n">background</span><span class="p">,</span>
<span class="n">date_applied</span><span class="o">=</span><span class="n">applied_date</span><span class="p">,</span> <span class="n">account_id</span><span class="o">=</span><span class="n">user</span><span class="o">.</span><span class="n">id</span><span class="p">,</span>
<span class="n">submitted</span><span class="o">=</span><span class="n">submitted</span><span class="p">)</span>
<span class="n">app</span><span class="o">.</span><span class="n">save</span><span class="p">()</span>
<span class="k">if</span> <span class="n">submitted</span><span class="p">:</span>
@ -344,9 +262,9 @@ name and background. This form we create in <code class="docutils literal notran
<span class="n">typeclass</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">BASE_CHARACTER_TYPECLASS</span>
<span class="n">home</span> <span class="o">=</span> <span class="n">ObjectDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_id</span><span class="p">(</span><span class="n">settings</span><span class="o">.</span><span class="n">GUEST_HOME</span><span class="p">)</span>
<span class="c1"># turn the permissionhandler to a string</span>
<span class="n">perms</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">user</span><span class="o">.</span><span class="n">permissions</span><span class="p">)</span>
<span class="n">perms</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">user</span><span class="o">.</span><span class="n">permissions</span><span class="p">)</span>
<span class="c1"># create the character</span>
<span class="n">char</span> <span class="o">=</span> <span class="n">create</span><span class="o">.</span><span class="n">create_object</span><span class="p">(</span><span class="n">typeclass</span><span class="o">=</span><span class="n">typeclass</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="n">name</span><span class="p">,</span>
<span class="n">char</span> <span class="o">=</span> <span class="n">create</span><span class="o">.</span><span class="n">create_object</span><span class="p">(</span><span class="n">typeclass</span><span class="o">=</span><span class="n">typeclass</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="n">name</span><span class="p">,</span>
<span class="n">home</span><span class="o">=</span><span class="n">home</span><span class="p">,</span> <span class="n">permissions</span><span class="o">=</span><span class="n">perms</span><span class="p">)</span>
<span class="n">user</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">_playable_characters</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">char</span><span class="p">)</span>
<span class="c1"># add the right locks for the character so the account can</span>
@ -363,7 +281,7 @@ name and background. This form we create in <code class="docutils literal notran
<span class="n">form</span> <span class="o">=</span> <span class="n">AppForm</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">&#39;chargen/create.html&#39;</span><span class="p">,</span> <span class="p">{</span><span class="s1">&#39;form&#39;</span><span class="p">:</span> <span class="n">form</span><span class="p">})</span>
</pre></div>
</td></tr></table></div>
</div>
<blockquote>
<div><p>Note also that we basically create the character using the Evennia API, and we grab the proper
permissions from the <code class="docutils literal notranslate"><span class="pre">AccountDB</span></code> object and copy them to the character object. We take the user
@ -372,9 +290,9 @@ create_object function to properly process the permissions.</p>
</div></blockquote>
<p>Most importantly, the following attributes must be set on the created character object:</p>
<ul class="simple">
<li><p>Evennia <a class="reference external" href="Components/Locks.html#permissions">permissions</a> (copied from the <code class="docutils literal notranslate"><span class="pre">AccountDB</span></code>).</p></li>
<li><p>The right <code class="docutils literal notranslate"><span class="pre">puppet</span></code> <a class="reference internal" href="../Components/Locks.html"><span class="doc">locks</span></a> so the Account can actually play as this Character later.</p></li>
<li><p>The relevant Character <a class="reference internal" href="../Components/Typeclasses.html"><span class="doc">typeclass</span></a></p></li>
<li><p>Evennia <a class="reference internal" href="../Components/Permissions.html"><span class="doc std std-doc">permissions</span></a> (copied from the <code class="docutils literal notranslate"><span class="pre">AccountDB</span></code>).</p></li>
<li><p>The right <code class="docutils literal notranslate"><span class="pre">puppet</span></code> <a class="reference internal" href="../Components/Locks.html"><span class="doc std std-doc">locks</span></a> so the Account can actually play as this Character later.</p></li>
<li><p>The relevant Character <a class="reference internal" href="../Components/Typeclasses.html"><span class="doc std std-doc">typeclass</span></a></p></li>
<li><p>Character name (key)</p></li>
<li><p>The Characters home room location (<code class="docutils literal notranslate"><span class="pre">#2</span></code> by default)</p></li>
</ul>
@ -383,74 +301,8 @@ character. It may be a good idea to decompose this function and create a separat
function in order to set up your character object the account owns. But with the Evennia API,
setting custom attributes is as easy as doing it in the meat of your Evennia game directory.</p>
<p>After all of this, our <code class="docutils literal notranslate"><span class="pre">views.py</span></code> file should look like something like this:</p>
<div class="highlight-python notranslate"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal"> 1</span>
<span class="normal"> 2</span>
<span class="normal"> 3</span>
<span class="normal"> 4</span>
<span class="normal"> 5</span>
<span class="normal"> 6</span>
<span class="normal"> 7</span>
<span class="normal"> 8</span>
<span class="normal"> 9</span>
<span class="normal">10</span>
<span class="normal">11</span>
<span class="normal">12</span>
<span class="normal">13</span>
<span class="normal">14</span>
<span class="normal">15</span>
<span class="normal">16</span>
<span class="normal">17</span>
<span class="normal">18</span>
<span class="normal">19</span>
<span class="normal">20</span>
<span class="normal">21</span>
<span class="normal">22</span>
<span class="normal">23</span>
<span class="normal">24</span>
<span class="normal">25</span>
<span class="normal">26</span>
<span class="normal">27</span>
<span class="normal">28</span>
<span class="normal">29</span>
<span class="normal">30</span>
<span class="normal">31</span>
<span class="normal">32</span>
<span class="normal">33</span>
<span class="normal">34</span>
<span class="normal">35</span>
<span class="normal">36</span>
<span class="normal">37</span>
<span class="normal">38</span>
<span class="normal">39</span>
<span class="normal">40</span>
<span class="normal">41</span>
<span class="normal">42</span>
<span class="normal">43</span>
<span class="normal">44</span>
<span class="normal">45</span>
<span class="normal">46</span>
<span class="normal">47</span>
<span class="normal">48</span>
<span class="normal">49</span>
<span class="normal">50</span>
<span class="normal">51</span>
<span class="normal">52</span>
<span class="normal">53</span>
<span class="normal">54</span>
<span class="normal">55</span>
<span class="normal">56</span>
<span class="normal">57</span>
<span class="normal">58</span>
<span class="normal">59</span>
<span class="normal">60</span>
<span class="normal">61</span>
<span class="normal">62</span>
<span class="normal">63</span>
<span class="normal">64</span>
<span class="normal">65</span>
<span class="normal">66</span>
<span class="normal">67</span></pre></div></td><td class="code"><div class="highlight"><pre><span></span><span class="c1"># file mygame/web/chargen/views.py</span>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># file mygame/web/chargen/views.py</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">web.chargen.models</span> <span class="kn">import</span> <span class="n">CharApp</span>
<span class="kn">from</span> <span class="nn">web.chargen.forms</span> <span class="kn">import</span> <span class="n">AppForm</span>
@ -474,7 +326,7 @@ setting custom attributes is as easy as doing it in the meat of your Evennia gam
<span class="n">background</span> <span class="o">=</span> <span class="n">app</span><span class="o">.</span><span class="n">background</span>
<span class="n">submitted</span> <span class="o">=</span> <span class="n">app</span><span class="o">.</span><span class="n">submitted</span>
<span class="n">p_id</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">user</span><span class="o">.</span><span class="n">id</span>
<span class="n">context</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="n">name</span><span class="p">,</span> <span class="s1">&#39;background&#39;</span><span class="p">:</span> <span class="n">background</span><span class="p">,</span>
<span class="n">context</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="n">name</span><span class="p">,</span> <span class="s1">&#39;background&#39;</span><span class="p">:</span> <span class="n">background</span><span class="p">,</span>
<span class="s1">&#39;p_id&#39;</span><span class="p">:</span> <span class="n">p_id</span><span class="p">,</span> <span class="s1">&#39;submitted&#39;</span><span class="p">:</span> <span class="n">submitted</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">&#39;chargen/detail.html&#39;</span><span class="p">,</span> <span class="n">context</span><span class="p">)</span>
@ -489,8 +341,8 @@ setting custom attributes is as easy as doing it in the meat of your Evennia gam
<span class="n">submitted</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">if</span> <span class="s1">&#39;save&#39;</span> <span class="ow">in</span> <span class="n">request</span><span class="o">.</span><span class="n">POST</span><span class="p">:</span>
<span class="n">submitted</span> <span class="o">=</span> <span class="kc">False</span>
<span class="n">app</span> <span class="o">=</span> <span class="n">CharApp</span><span class="p">(</span><span class="n">char_name</span><span class="o">=</span><span class="n">name</span><span class="p">,</span> <span class="n">background</span><span class="o">=</span><span class="n">background</span><span class="p">,</span>
<span class="n">date_applied</span><span class="o">=</span><span class="n">applied_date</span><span class="p">,</span> <span class="n">account_id</span><span class="o">=</span><span class="n">user</span><span class="o">.</span><span class="n">id</span><span class="p">,</span>
<span class="n">app</span> <span class="o">=</span> <span class="n">CharApp</span><span class="p">(</span><span class="n">char_name</span><span class="o">=</span><span class="n">name</span><span class="p">,</span> <span class="n">background</span><span class="o">=</span><span class="n">background</span><span class="p">,</span>
<span class="n">date_applied</span><span class="o">=</span><span class="n">applied_date</span><span class="p">,</span> <span class="n">account_id</span><span class="o">=</span><span class="n">user</span><span class="o">.</span><span class="n">id</span><span class="p">,</span>
<span class="n">submitted</span><span class="o">=</span><span class="n">submitted</span><span class="p">)</span>
<span class="n">app</span><span class="o">.</span><span class="n">save</span><span class="p">()</span>
<span class="k">if</span> <span class="n">submitted</span><span class="p">:</span>
@ -498,9 +350,9 @@ setting custom attributes is as easy as doing it in the meat of your Evennia gam
<span class="n">typeclass</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">BASE_CHARACTER_TYPECLASS</span>
<span class="n">home</span> <span class="o">=</span> <span class="n">ObjectDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_id</span><span class="p">(</span><span class="n">settings</span><span class="o">.</span><span class="n">GUEST_HOME</span><span class="p">)</span>
<span class="c1"># turn the permissionhandler to a string</span>
<span class="n">perms</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">user</span><span class="o">.</span><span class="n">permissions</span><span class="p">)</span>
<span class="n">perms</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">user</span><span class="o">.</span><span class="n">permissions</span><span class="p">)</span>
<span class="c1"># create the character</span>
<span class="n">char</span> <span class="o">=</span> <span class="n">create</span><span class="o">.</span><span class="n">create_object</span><span class="p">(</span><span class="n">typeclass</span><span class="o">=</span><span class="n">typeclass</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="n">name</span><span class="p">,</span>
<span class="n">char</span> <span class="o">=</span> <span class="n">create</span><span class="o">.</span><span class="n">create_object</span><span class="p">(</span><span class="n">typeclass</span><span class="o">=</span><span class="n">typeclass</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="n">name</span><span class="p">,</span>
<span class="n">home</span><span class="o">=</span><span class="n">home</span><span class="p">,</span> <span class="n">permissions</span><span class="o">=</span><span class="n">perms</span><span class="p">)</span>
<span class="n">user</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">_playable_characters</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">char</span><span class="p">)</span>
<span class="c1"># add the right locks for the character so the account can</span>
@ -517,12 +369,12 @@ setting custom attributes is as easy as doing it in the meat of your Evennia gam
<span class="n">form</span> <span class="o">=</span> <span class="n">AppForm</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">&#39;chargen/create.html&#39;</span><span class="p">,</span> <span class="p">{</span><span class="s1">&#39;form&#39;</span><span class="p">:</span> <span class="n">form</span><span class="p">})</span>
</pre></div>
</td></tr></table></div>
</div>
<section id="create-views-checkpoint">
<h3>Create Views - Checkpoint:<a class="headerlink" href="#create-views-checkpoint" title="Permalink to this headline"></a></h3>
<ul class="simple">
<li><p>youve defined a <code class="docutils literal notranslate"><span class="pre">views.py</span></code> that has an index, detail, and creating functions.</p></li>
<li><p>youve defined a forms.py with the <code class="docutils literal notranslate"><span class="pre">AppForm</span></code> class needed by the <code class="docutils literal notranslate"><span class="pre">creating</span></code> function of
<li><p>youve defined a <a class="reference external" href="http://forms.py">forms.py</a> with the <code class="docutils literal notranslate"><span class="pre">AppForm</span></code> class needed by the <code class="docutils literal notranslate"><span class="pre">creating</span></code> function of
<code class="docutils literal notranslate"><span class="pre">views.py</span></code>.</p></li>
<li><p>your <code class="docutils literal notranslate"><span class="pre">mygame/web/chargen</span></code> directory should now have a <code class="docutils literal notranslate"><span class="pre">views.py</span></code> and <code class="docutils literal notranslate"><span class="pre">forms.py</span></code> file</p></li>
</ul>
@ -532,19 +384,7 @@ setting custom attributes is as easy as doing it in the meat of your Evennia gam
<h2>Create URLs<a class="headerlink" href="#create-urls" title="Permalink to this headline"></a></h2>
<p>URL patterns helps redirect requests from the web browser to the right views. These patterns are
created in <code class="docutils literal notranslate"><span class="pre">mygame/web/chargen/urls.py</span></code>.</p>
<div class="highlight-python notranslate"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal"> 1</span>
<span class="normal"> 2</span>
<span class="normal"> 3</span>
<span class="normal"> 4</span>
<span class="normal"> 5</span>
<span class="normal"> 6</span>
<span class="normal"> 7</span>
<span class="normal"> 8</span>
<span class="normal"> 9</span>
<span class="normal">10</span>
<span class="normal">11</span>
<span class="normal">12</span>
<span class="normal">13</span></pre></div></td><td class="code"><div class="highlight"><pre><span></span><span class="c1"># file mygame/web/chargen/urls.py</span>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># file mygame/web/chargen/urls.py</span>
<span class="kn">from</span> <span class="nn">django.conf.urls</span> <span class="kn">import</span> <span class="n">url</span>
<span class="kn">from</span> <span class="nn">web.chargen</span> <span class="kn">import</span> <span class="n">views</span>
@ -558,31 +398,14 @@ created in <code class="docutils literal notranslate"><span class="pre">mygame/w
<span class="n">url</span><span class="p">(</span><span class="sa">r</span><span class="s1">&#39;^create/$&#39;</span><span class="p">,</span> <span class="n">views</span><span class="o">.</span><span class="n">creating</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s1">&#39;creating&#39;</span><span class="p">),</span>
<span class="p">]</span>
</pre></div>
</td></tr></table></div>
</div>
<p>You could change the format as you desire. To make it more secure, you could remove app_id from the
“detail” url, and instead just fetch the accounts applications using a unifying field like
account_id to find all the character application objects to display.</p>
<p>We must also update the main <code class="docutils literal notranslate"><span class="pre">mygame/web/urls.py</span></code> file (that is, one level up from our chargen app),
so the main website knows where our apps views are located. Find the <code class="docutils literal notranslate"><span class="pre">patterns</span></code> variable, and
change it to include:</p>
<div class="highlight-python notranslate"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal"> 1</span>
<span class="normal"> 2</span>
<span class="normal"> 3</span>
<span class="normal"> 4</span>
<span class="normal"> 5</span>
<span class="normal"> 6</span>
<span class="normal"> 7</span>
<span class="normal"> 8</span>
<span class="normal"> 9</span>
<span class="normal">10</span>
<span class="normal">11</span>
<span class="normal">12</span>
<span class="normal">13</span>
<span class="normal">14</span>
<span class="normal">15</span>
<span class="normal">16</span>
<span class="normal">17</span>
<span class="normal">18</span></pre></div></td><td class="code"><div class="highlight"><pre><span></span><span class="c1"># in file mygame/web/urls.py</span>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># in file mygame/web/urls.py</span>
<span class="kn">from</span> <span class="nn">django.conf.urls</span> <span class="kn">import</span> <span class="n">url</span><span class="p">,</span> <span class="n">include</span>
@ -601,11 +424,11 @@ change it to include:</p>
<span class="n">urlpatterns</span> <span class="o">=</span> <span class="n">custom_patterns</span> <span class="o">+</span> <span class="n">urlpatterns</span>
</pre></div>
</td></tr></table></div>
</div>
<section id="urls-checkpoint">
<h3>URLs - Checkpoint:<a class="headerlink" href="#urls-checkpoint" title="Permalink to this headline"></a></h3>
<ul class="simple">
<li><p>Youve created a urls.py file in the <code class="docutils literal notranslate"><span class="pre">mygame/web/chargen</span></code> directory</p></li>
<li><p>Youve created a <a class="reference external" href="http://urls.py">urls.py</a> file in the <code class="docutils literal notranslate"><span class="pre">mygame/web/chargen</span></code> directory</p></li>
<li><p>You have edited the main <code class="docutils literal notranslate"><span class="pre">mygame/web/urls.py</span></code> file to include urls to the <code class="docutils literal notranslate"><span class="pre">chargen</span></code> directory.</p></li>
</ul>
</section>
@ -625,25 +448,7 @@ this demonstration, we will only list the applications that the account has subm
easily adjust this to include saved applications, or other types of applications if you have
different kinds.</p>
<p>Please refer back to <code class="docutils literal notranslate"><span class="pre">views.py</span></code> to see where we define the variables these templates make use of.</p>
<div class="highlight-html notranslate"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal"> 1</span>
<span class="normal"> 2</span>
<span class="normal"> 3</span>
<span class="normal"> 4</span>
<span class="normal"> 5</span>
<span class="normal"> 6</span>
<span class="normal"> 7</span>
<span class="normal"> 8</span>
<span class="normal"> 9</span>
<span class="normal">10</span>
<span class="normal">11</span>
<span class="normal">12</span>
<span class="normal">13</span>
<span class="normal">14</span>
<span class="normal">15</span>
<span class="normal">16</span>
<span class="normal">17</span>
<span class="normal">18</span>
<span class="normal">19</span></pre></div></td><td class="code"><div class="highlight"><pre><span></span><span class="c">&lt;!-- file mygame/web/chargen/templates/chargen/index.html--&gt;</span>
<div class="highlight-html notranslate"><div class="highlight"><pre><span></span><span class="c">&lt;!-- file mygame/web/chargen/templates/chargen/index.html--&gt;</span>
{% extends &quot;base.html&quot; %}
{% block content %}
@ -663,7 +468,7 @@ different kinds.</p>
{% endif %}
{% endblock %}
</pre></div>
</td></tr></table></div>
</div>
</section>
<section id="detail-html">
<h3>detail.html<a class="headerlink" href="#detail-html" title="Permalink to this headline"></a></h3>
@ -671,24 +476,7 @@ different kinds.</p>
name and character background. You will likely want to extend this to show many more fields for your
game. In a full-fledged character generation, you may want to extend the boolean attribute of
submitted to allow accounts to save character applications and submit them later.</p>
<div class="highlight-html notranslate"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal"> 1</span>
<span class="normal"> 2</span>
<span class="normal"> 3</span>
<span class="normal"> 4</span>
<span class="normal"> 5</span>
<span class="normal"> 6</span>
<span class="normal"> 7</span>
<span class="normal"> 8</span>
<span class="normal"> 9</span>
<span class="normal">10</span>
<span class="normal">11</span>
<span class="normal">12</span>
<span class="normal">13</span>
<span class="normal">14</span>
<span class="normal">15</span>
<span class="normal">16</span>
<span class="normal">17</span>
<span class="normal">18</span></pre></div></td><td class="code"><div class="highlight"><pre><span></span><span class="c">&lt;!-- file mygame/web/chargen/templates/chargen/detail.html--&gt;</span>
<div class="highlight-html notranslate"><div class="highlight"><pre><span></span><span class="c">&lt;!-- file mygame/web/chargen/templates/chargen/detail.html--&gt;</span>
{% extends &quot;base.html&quot; %}
{% block content %}
@ -707,30 +495,16 @@ submitted to allow accounts to save character applications and submit them later
{% endif %}
{% endblock %}
</pre></div>
</td></tr></table></div>
</div>
</section>
<section id="create-html">
<h3>create.html<a class="headerlink" href="#create-html" title="Permalink to this headline"></a></h3>
<p>Our create HTML template will use the Django form we defined back in views.py/forms.py to drive the
<p>Our create HTML template will use the Django form we defined back in <a class="reference external" href="http://views.py/forms.py">views.py/forms.py</a> to drive the
majority of the application process. There will be a form input for every field we defined in
forms.py, which is handy. We have used POST as our method because we are sending information to the
<a class="reference external" href="http://forms.py">forms.py</a>, which is handy. We have used POST as our method because we are sending information to the
server that will update the database. As an alternative, GET would be much less secure. You can read
up on documentation elsewhere on the web for GET vs. POST.</p>
<div class="highlight-html notranslate"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal"> 1</span>
<span class="normal"> 2</span>
<span class="normal"> 3</span>
<span class="normal"> 4</span>
<span class="normal"> 5</span>
<span class="normal"> 6</span>
<span class="normal"> 7</span>
<span class="normal"> 8</span>
<span class="normal"> 9</span>
<span class="normal">10</span>
<span class="normal">11</span>
<span class="normal">12</span>
<span class="normal">13</span>
<span class="normal">14</span>
<span class="normal">15</span></pre></div></td><td class="code"><div class="highlight"><pre><span></span><span class="c">&lt;!-- file mygame/web/chargen/templates/chargen/create.html--&gt;</span>
<div class="highlight-html notranslate"><div class="highlight"><pre><span></span><span class="c">&lt;!-- file mygame/web/chargen/templates/chargen/create.html--&gt;</span>
{% extends &quot;base.html&quot; %}
{% block content %}
@ -746,7 +520,7 @@ up on documentation elsewhere on the web for GET vs. POST.</p>
{% endif %}
{% endblock %}
</pre></div>
</td></tr></table></div>
</div>
</section>
<section id="templates-checkpoint">
<h3>Templates - Checkpoint:<a class="headerlink" href="#templates-checkpoint" title="Permalink to this headline"></a></h3>
@ -759,13 +533,7 @@ up on documentation elsewhere on the web for GET vs. POST.</p>
<section id="activating-your-new-character-generation">
<h2>Activating your new character generation<a class="headerlink" href="#activating-your-new-character-generation" title="Permalink to this headline"></a></h2>
<p>After finishing this tutorial you should have edited or created the following files:</p>
<div class="highlight-bash notranslate"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span>
<span class="normal">2</span>
<span class="normal">3</span>
<span class="normal">4</span>
<span class="normal">5</span>
<span class="normal">6</span>
<span class="normal">7</span></pre></div></td><td class="code"><div class="highlight"><pre><span></span>mygame/web/urls.py
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>mygame/web/urls.py
mygame/web/chargen/models.py
mygame/web/chargen/views.py
mygame/web/chargen/urls.py
@ -773,13 +541,12 @@ mygame/web/chargen/templates/chargen/index.html
mygame/web/chargen/templates/chargen/create.html
mygame/web/chargen/templates/chargen/detail.html
</pre></div>
</td></tr></table></div>
</div>
<p>Once you have all these files stand in your <code class="docutils literal notranslate"><span class="pre">mygame/</span></code>folder and run:</p>
<div class="highlight-bash notranslate"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span>
<span class="normal">2</span></pre></div></td><td class="code"><div class="highlight"><pre><span></span>evennia makemigrations
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>evennia makemigrations
evennia migrate
</pre></div>
</td></tr></table></div>
</div>
<p>This will create and update the models. If you see any errors at this stage, read the traceback
carefully, it should be relatively easy to figure out where the error is.</p>
<p>Login to the website (you need to have previously registered an Player account with the game to do
@ -814,46 +581,33 @@ find both information on the web page. Both would contain a lot of letters and
<h3>Step 2: installing and configuring the dedicated Django app<a class="headerlink" href="#step-2-installing-and-configuring-the-dedicated-django-app" title="Permalink to this headline"></a></h3>
<p>Since Evennia runs on Django, the easiest way to add our CAPCHA and perform the proper check is to
install the dedicated Django app. Quite easy:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">pip</span> <span class="n">install</span> <span class="n">django</span><span class="o">-</span><span class="n">nocaptcha</span><span class="o">-</span><span class="n">recaptcha</span>
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>pip install django-nocaptcha-recaptcha
</pre></div>
</div>
<p>And add it to the installed apps in your settings. In your <code class="docutils literal notranslate"><span class="pre">mygame/server/conf/settings.py</span></code>, you
might have something like this:</p>
<div class="highlight-python notranslate"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span>
<span class="normal">2</span>
<span class="normal">3</span>
<span class="normal">4</span>
<span class="normal">5</span></pre></div></td><td class="code"><div class="highlight"><pre><span></span><span class="c1"># ...</span>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># ...</span>
<span class="n">INSTALLED_APPS</span> <span class="o">+=</span> <span class="p">(</span>
<span class="s1">&#39;web.chargen&#39;</span><span class="p">,</span>
<span class="s1">&#39;nocaptcha_recaptcha&#39;</span><span class="p">,</span>
<span class="p">)</span>
</pre></div>
</td></tr></table></div>
</div>
<p>Dont close the setting file just yet. We have to add in the site key and secret key. You can add
them below:</p>
<div class="highlight-python notranslate"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span>
<span class="normal">2</span>
<span class="normal">3</span>
<span class="normal">4</span></pre></div></td><td class="code"><div class="highlight"><pre><span></span><span class="c1"># NoReCAPCHA site key</span>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># NoReCAPCHA site key</span>
<span class="n">NORECAPTCHA_SITE_KEY</span> <span class="o">=</span> <span class="s2">&quot;PASTE YOUR SITE KEY HERE&quot;</span>
<span class="c1"># NoReCAPCHA secret key</span>
<span class="n">NORECAPTCHA_SECRET_KEY</span> <span class="o">=</span> <span class="s2">&quot;PUT YOUR SECRET KEY HERE&quot;</span>
</pre></div>
</td></tr></table></div>
</div>
</section>
<section id="step-3-adding-the-capcha-to-our-form">
<h3>Step 3: Adding the CAPCHA to our form<a class="headerlink" href="#step-3-adding-the-capcha-to-our-form" title="Permalink to this headline"></a></h3>
<p>Finally we have to add the CAPCHA to our form. It will be pretty easy too. First, open your
<code class="docutils literal notranslate"><span class="pre">web/chargen/forms.py</span></code> file. Were going to add a new field, but hopefully, all the hard work has
been done for us. Update at your convenience, You might end up with something like this:</p>
<div class="highlight-python notranslate"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span>
<span class="normal">2</span>
<span class="normal">3</span>
<span class="normal">4</span>
<span class="normal">5</span>
<span class="normal">6</span>
<span class="normal">7</span></pre></div></td><td class="code"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">django</span> <span class="kn">import</span> <span class="n">forms</span>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><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">nocaptcha_recaptcha.fields</span> <span class="kn">import</span> <span class="n">NoReCaptchaField</span>
<span class="k">class</span> <span class="nc">AppForm</span><span class="p">(</span><span class="n">forms</span><span class="o">.</span><span class="n">Form</span><span class="p">):</span>
@ -861,31 +615,18 @@ been done for us. Update at your convenience, You might end up with something l
<span class="n">background</span> <span class="o">=</span> <span class="n">forms</span><span class="o">.</span><span class="n">CharField</span><span class="p">(</span><span class="n">label</span><span class="o">=</span><span class="s1">&#39;Background&#39;</span><span class="p">)</span>
<span class="n">captcha</span> <span class="o">=</span> <span class="n">NoReCaptchaField</span><span class="p">()</span>
</pre></div>
</td></tr></table></div>
</div>
<p>As you see, we added a line of import (line 2) and a field in our form.</p>
<p>And lastly, we need to update our HTML file to add in the Google library. You can open
<code class="docutils literal notranslate"><span class="pre">web/chargen/templates/chargen/create.html</span></code>. Theres only one line to add:</p>
<div class="highlight-html notranslate"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span></pre></div></td><td class="code"><div class="highlight"><pre><span></span><span class="p">&lt;</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">&quot;https://www.google.com/recaptcha/api.js&quot;</span> <span class="na">async</span> <span class="na">defer</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
<div class="highlight-html notranslate"><div class="highlight"><pre><span></span><span class="p">&lt;</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">&quot;https://www.google.com/recaptcha/api.js&quot;</span> <span class="na">async</span> <span class="na">defer</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
</pre></div>
</td></tr></table></div>
</div>
<p>And you should put it at the bottom of the page. Just before the closing body would be good, but
for the time being, the base page doesnt provide a footer block, so well put it in the content
block. Note that its not the best place, but it will work. In the end, your
<code class="docutils literal notranslate"><span class="pre">web/chargen/templates/chargen/create.html</span></code> file should look like this:</p>
<div class="highlight-html notranslate"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal"> 1</span>
<span class="normal"> 2</span>
<span class="normal"> 3</span>
<span class="normal"> 4</span>
<span class="normal"> 5</span>
<span class="normal"> 6</span>
<span class="normal"> 7</span>
<span class="normal"> 8</span>
<span class="normal"> 9</span>
<span class="normal">10</span>
<span class="normal">11</span>
<span class="normal">12</span>
<span class="normal">13</span>
<span class="normal">14</span></pre></div></td><td class="code"><div class="highlight"><pre><span></span>{% extends &quot;base.html&quot; %}
<div class="highlight-html notranslate"><div class="highlight"><pre><span></span>{% extends &quot;base.html&quot; %}
{% block content %}
<span class="p">&lt;</span><span class="nt">h1</span><span class="p">&gt;</span>Character Creation<span class="p">&lt;/</span><span class="nt">h1</span><span class="p">&gt;</span>
{% if user.is_authenticated %}
@ -900,7 +641,7 @@ block. Note that its not the best place, but it will work. In the end, your
<span class="p">&lt;</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">&quot;https://www.google.com/recaptcha/api.js&quot;</span> <span class="na">async</span> <span class="na">defer</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
{% endblock %}
</pre></div>
</td></tr></table></div>
</div>
<p>Reload and open <a class="reference external" href="http://localhost:4001/chargen/create/">http://localhost:4001/chargen/create</a> and
you should see your beautiful CAPCHA just before the “submit” button. Try not to check the checkbox
to see what happens. And do the same while checking the checkbox!</p>
@ -992,7 +733,7 @@ to see what happens. And do the same while checking the checkbox!</p>
<h3>Versions</h3>
<ul>
<li><a href="Web-Character-Generation.html">1.0-dev (develop branch)</a></li>
<li><a href="../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
<li><a href="../../0.95/index.html">0.95 (v0.9.5 branch)</a></li>
</ul>
</div>