<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Rodrigo Lazo </title>
    <description>The latest articles on DEV Community by Rodrigo Lazo  (@rodrigolazo).</description>
    <link>https://dev.to/rodrigolazo</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F774975%2F210bb51f-724e-4e2e-ab9f-62ecf178a2ad.jpeg</url>
      <title>DEV Community: Rodrigo Lazo </title>
      <link>https://dev.to/rodrigolazo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rodrigolazo"/>
    <language>en</language>
    <item>
      <title>How to create a TV Show React App - tvmaze</title>
      <dc:creator>Rodrigo Lazo </dc:creator>
      <pubDate>Tue, 11 Jan 2022 23:51:37 +0000</pubDate>
      <link>https://dev.to/rodrigolazo/how-to-create-a-tv-show-react-app-tvmaze-f21</link>
      <guid>https://dev.to/rodrigolazo/how-to-create-a-tv-show-react-app-tvmaze-f21</guid>
      <description>&lt;p&gt;Today, We are going to create an application that shows the information of TV Show, using a search bar.&lt;/p&gt;

&lt;p&gt;This project uses&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;react-scripts (Styles)&lt;/li&gt;
&lt;li&gt;react-spinners (Loader)&lt;/li&gt;
&lt;li&gt;axios (request Http)&lt;/li&gt;
&lt;li&gt;react-icons (Icons)&lt;/li&gt;
&lt;li&gt;framer-motion (Animations)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Api: &lt;a href="https://www.tvmaze.com/api" rel="noopener noreferrer"&gt;https://www.tvmaze.com/api&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Code From Github: &lt;a href="https://github.com/rodrigolazo/react-tvmaze" rel="noopener noreferrer"&gt;https://github.com/rodrigolazo/react-tvmaze&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;project structure&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff5qepexva7dy0wcbpfi4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff5qepexva7dy0wcbpfi4.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code:&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;&lt;strong&gt;App.js&lt;/strong&gt;&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import styled from "styled-components";
import "./App.css";
import Header from "./components/header";
import { SearchBar } from "./components/searchBar";

const AppContainer = styled.div`
  margin: auto;
  padding: 0 530px;
`;

function App() {
  return (
    &amp;lt;&amp;gt;
      &amp;lt;AppContainer&amp;gt;
        &amp;lt;Header /&amp;gt;
        &amp;lt;SearchBar /&amp;gt;
      &amp;lt;/AppContainer&amp;gt;
    &amp;lt;/&amp;gt;
  );
}

export default App;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Header/index.jsx&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React from 'react'
import logo from '../../img/logo.png'

const Header = () =&amp;gt; {
  return (
    &amp;lt;header className='center'&amp;gt;
      &amp;lt;img src={logo} alt='' /&amp;gt;
    &amp;lt;/header&amp;gt;
  )
}

export default Header
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;searchBar/index.jsx&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React from "react";
import styled from "styled-components";
import { IoClose, IoSearch } from "react-icons/io5";
import { useState } from "react";
import { AnimatePresence, motion } from "framer-motion";
import { useClickOutside } from "react-click-outside-hook";
import { useEffect } from "react";
import { useRef } from "react";
import BeatLoader from "react-spinners/BeatLoader";
import { useDebounce } from "../../hooks/debounceHook";
import axios from "axios";
import { TvShow } from "../tvShow";

const SearchBarContainer = styled(motion.div)`
  display: flex;
  flex-direction: column;
  width: 34em;
  height: 3.8em;
  background-color: #fff;
  border-radius: 6px;
  box-shadow: 0px 2px 12px 3px rgba(0, 0, 0, 0.14);
`;

const SearchInputContainer = styled.div`
  width: 100%;
  min-height: 4em;
  display: flex;
  align-items: center;
  position: relative;
  padding: 2px 15px;
`;

const SearchInput = styled.input`
  width: 100%;
  height: 100%;
  outline: none;
  border: none;
  font-size: 21px;
  color: #12112e;
  font-weight: 500;
  border-radius: 6px;
  background-color: transparent;

  &amp;amp;:focus {
    outline: none;
    &amp;amp;::placeholder {
      opacity: 0;
    }
  }

  &amp;amp;::placeholder {
    color: #bebebe;
    transition: all 250ms ease-in-out;
  }
`;

const SearchIcon = styled.span`
  color: #bebebe;
  font-size: 27px;
  margin-right: 10px;
  margin-top: 6px;
  vertical-align: middle;
`;

const CloseIcon = styled(motion.span)`
  color: #bebebe;
  font-size: 23px;
  vertical-align: middle;
  transition: all 200ms ease-in-out;
  cursor: pointer;

  &amp;amp;:hover {
    color: #dfdfdf;
  }
`;

const LineSeperator = styled.span`
  display: flex;
  min-width: 100%;
  min-height: 2px;
  background-color: #d8d8d878;
`;

const SearchContent = styled.div`
  width: 100%;
  height: 100%;
  display: flex;
  flex-direction: column;
  padding: 1em;
  overflow-y: auto;
`;

const LoadingWrapper = styled.div`
  width: 100%;
  height: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
`;

const WarningMessage = styled.span`
  color: #a1a1a1;
  font-size: 14px;
  display: flex;
  align-self: center;
  justify-self: center;
`;

const containerVariants = {
  expanded: {
    height: "30em",
  },
  collapsed: {
    height: "3.8em",
  },
};

const containerTransition = { type: "spring", damping: 22, stiffness: 150 };

export function SearchBar(props) {
  const [isExpanded, setExpanded] = useState(false);
  const [parentRef, isClickedOutside] = useClickOutside();
  const inputRef = useRef();
  const [searchQuery, setSearchQuery] = useState("");
  const [isLoading, setLoading] = useState(false);
  const [tvShows, setTvShows] = useState([]);
  const [noTvShows, setNoTvShows] = useState(false);

  const isEmpty = !tvShows || tvShows.length === 0;

  const changeHandler = (e) =&amp;gt; {
    e.preventDefault();
    if (e.target.value.trim() === "") setNoTvShows(false);

    setSearchQuery(e.target.value);
  };

  const expandContainer = () =&amp;gt; {
    setExpanded(true);
  };

  const collapseContainer = () =&amp;gt; {
    setExpanded(false);
    setSearchQuery("");
    setLoading(false);
    setNoTvShows(false);
    setTvShows([]);
    if (inputRef.current) inputRef.current.value = "";
  };

  useEffect(() =&amp;gt; {
    if (isClickedOutside) collapseContainer();
  }, [isClickedOutside]);

  const prepareSearchQuery = (query) =&amp;gt; {
    const url = `http://api.tvmaze.com/search/shows?q=${query}`;

    return encodeURI(url);
  };

  const searchTvShow = async () =&amp;gt; {
    if (!searchQuery || searchQuery.trim() === "") return;

    setLoading(true);
    setNoTvShows(false);

    const URL = prepareSearchQuery(searchQuery);

    const response = await axios.get(URL).catch((err) =&amp;gt; {
      console.log("Error: ", err);
    });

    if (response) {
      console.log("Response: ", response.data);
      if (response.data &amp;amp;&amp;amp; response.data.length === 0) setNoTvShows(true);

      setTvShows(response.data);
    }

    setLoading(false);
  };

  useDebounce(searchQuery, 500, searchTvShow);

  return (
    &amp;lt;SearchBarContainer
      animate={isExpanded ? "expanded" : "collapsed"}
      variants={containerVariants}
      transition={containerTransition}
      ref={parentRef}
    &amp;gt;
      &amp;lt;SearchInputContainer&amp;gt;
        &amp;lt;SearchIcon&amp;gt;
          &amp;lt;IoSearch /&amp;gt;
        &amp;lt;/SearchIcon&amp;gt;
        &amp;lt;SearchInput
          placeholder="Search for series and TvShow"
          onFocus={expandContainer}
          ref={inputRef}
          value={searchQuery}
          onChange={changeHandler}
        /&amp;gt;
        &amp;lt;AnimatePresence&amp;gt;
          {isExpanded &amp;amp;&amp;amp; (
            &amp;lt;CloseIcon
              key="close-icon"
              initial={{ opacity: 0 }}
              animate={{ opacity: 1 }}
              exit={{ opacity: 0 }}
              onClick={collapseContainer}
              transition={{ duration: 0.2 }}
            &amp;gt;
              &amp;lt;IoClose /&amp;gt;
            &amp;lt;/CloseIcon&amp;gt;
          )}
        &amp;lt;/AnimatePresence&amp;gt;
      &amp;lt;/SearchInputContainer&amp;gt;
      {isExpanded &amp;amp;&amp;amp; &amp;lt;LineSeperator /&amp;gt;}
      {isExpanded &amp;amp;&amp;amp; (
        &amp;lt;SearchContent&amp;gt;
          {isLoading &amp;amp;&amp;amp; (
            &amp;lt;LoadingWrapper&amp;gt;
              &amp;lt;BeatLoader loading color="#3C948B" size={10} /&amp;gt;
            &amp;lt;/LoadingWrapper&amp;gt;
          )}
          {!isLoading &amp;amp;&amp;amp; isEmpty &amp;amp;&amp;amp; !noTvShows &amp;amp;&amp;amp; (
            &amp;lt;LoadingWrapper&amp;gt;
              &amp;lt;WarningMessage&amp;gt;Start typing to Search&amp;lt;/WarningMessage&amp;gt;
            &amp;lt;/LoadingWrapper&amp;gt;
          )}
          {!isLoading &amp;amp;&amp;amp; noTvShows &amp;amp;&amp;amp; (
            &amp;lt;LoadingWrapper&amp;gt;
              &amp;lt;WarningMessage&amp;gt;No series or Tv Shows  found!&amp;lt;/WarningMessage&amp;gt;
            &amp;lt;/LoadingWrapper&amp;gt;
          )}
          {!isLoading &amp;amp;&amp;amp; !isEmpty &amp;amp;&amp;amp; (
            &amp;lt;&amp;gt;
              {tvShows.map(({ show }) =&amp;gt; (
                &amp;lt;TvShow
                  key={show.id}
                  thumbanilSrc={show.image &amp;amp;&amp;amp; show.image.medium}
                  name={show.name}
                  rating={show.rating &amp;amp;&amp;amp; show.rating.average}
                  url={show.url}
                /&amp;gt;
              ))}
            &amp;lt;/&amp;gt;
          )}
        &amp;lt;/SearchContent&amp;gt;
      )}
    &amp;lt;/SearchBarContainer&amp;gt;
  );
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;tvShow/index.jsx&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React from "react";
import styled from "styled-components";

const TvShowContainer = styled.div`
  width: 100%;
  min-height: 6em;
  display: flex;
  border-bottom: 2px solid #d8d8d852;
  padding: 6px 8px;
  align-items: center;

  &amp;amp;:hover {
    background-color: #dadada;
    transition: all 0.3s ease;
    border-radius: 3px;
  }
`;

const Thumbnail = styled.div`
  width: auto;
  height: 100%;
  display: flex;
  flex: 0.4;

  img {
    width: auto;
    height: 100%;
  }
`;

const Name = styled.h3`
  font-size: 15px;
  color: #000;
  margin-left: 10px;
  flex: 2;
  display: flex;
`;

const Rating = styled.span`
  color: #a1a1a1;
  font-size: 16px;
  display: flex;
  flex: 0.2;
`;

export function TvShow(props) {
  const { thumbanilSrc, name, rating, url } = props;

  return (
    &amp;lt;TvShowContainer&amp;gt;
      &amp;lt;Thumbnail&amp;gt;
        &amp;lt;img src={thumbanilSrc} /&amp;gt;
      &amp;lt;/Thumbnail&amp;gt;

      &amp;lt;Name&amp;gt;
        &amp;lt;a href={url} target="_blank"&amp;gt;
          {name}
        &amp;lt;/a&amp;gt;
      &amp;lt;/Name&amp;gt;
      &amp;lt;Rating&amp;gt;{rating || "N/A"}&amp;lt;/Rating&amp;gt;
    &amp;lt;/TvShowContainer&amp;gt;
  );
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;hooks/debounceHook.jsx&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React from "react";
import { useEffect } from "react";
import { useState } from "react";

export function useDebounce(value, timeout, callback) {
  const [timer, setTimer] = useState(null);

  const clearTimer = () =&amp;gt; {
    if (timer) clearTimeout(timer);
  };

  useEffect(() =&amp;gt; {
    clearTimer();

    if (value &amp;amp;&amp;amp; callback) {
      const newTimer = setTimeout(callback, timeout);
      setTimer(newTimer);
    }
  }, [value]);
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Style&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;&lt;strong&gt;App.css&lt;/strong&gt;&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;body {
  background: #000 url('img/bg.jpg') no-repeat center center/cover;
  font-family: Arial, Helvetica, sans-serif;
}

.App {
  text-align: center;
}

.App-logo {
  height: 40vmin;
  pointer-events: none;
}

@media (prefers-reduced-motion: no-preference) {
  .App-logo {
    animation: App-logo-spin infinite 20s linear;
  }
}

.App-header {
  background-color: #282c34;
  min-height: 100vh;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  font-size: calc(10px + 2vmin);
  color: white;
}

.App-link {
  color: #61dafb;
}

@keyframes App-logo-spin {
  from {
    transform: rotate(0deg);
  }
  to {
    transform: rotate(360deg);
  }
}


header {
  height: 200px;
}

header img {
  width: 300px;
}

.center {
  display: flex;
  align-items: center;
  justify-content: center;
}

a {
  color: #474747;
  text-decoration: none;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Results&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ly68mlyjh76pl19e6hf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ly68mlyjh76pl19e6hf.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frftxeux6gi9233bbxufg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frftxeux6gi9233bbxufg.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6yksocy59wnm9t6q5xnu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6yksocy59wnm9t6q5xnu.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Download the project to test the applied styles, I hope it helps you&lt;/p&gt;

&lt;p&gt;Github: &lt;a href="https://github.com/rodrigolazo/react-tvmaze" rel="noopener noreferrer"&gt;https://github.com/rodrigolazo/react-tvmaze&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;references:&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=x7niho285qs" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=x7niho285qs&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=IlnmWntmUns&amp;amp;t=2974s" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=IlnmWntmUns&amp;amp;t=2974s&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>api</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to create a React JS application with the Pokémon API</title>
      <dc:creator>Rodrigo Lazo </dc:creator>
      <pubDate>Thu, 23 Dec 2021 22:36:02 +0000</pubDate>
      <link>https://dev.to/rodrigolazo/how-to-create-a-react-js-application-with-the-pokemon-api-28jn</link>
      <guid>https://dev.to/rodrigolazo/how-to-create-a-react-js-application-with-the-pokemon-api-28jn</guid>
      <description>&lt;p&gt;We are going to create an application that shows the information of the pokemos, consumed from an API.&lt;/p&gt;

&lt;p&gt;Api: &lt;a href="https://pokeapi.co/"&gt;https://pokeapi.co/&lt;/a&gt;&lt;br&gt;
Github: &lt;a href="https://github.com/rodrigolazo/apiPokemon"&gt;https://github.com/rodrigolazo/apiPokemon&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code:&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;&lt;em&gt;App.js&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React, { useEffect } from 'react';
import './App.css';

import CharacterGrid from './components/characters/CharacterGrid'
import Header from './components/ui/Header'

function App() {
  const [result, setResult] = React.useState([]);
  const [poke, setPoke] = React.useState([]);
  const [load, setLoad] = React.useState('true');
  const arr = [];

  useEffect(() =&amp;gt; {
    fetch('https://pokeapi.co/api/v2/pokemon/?limit=400')
      .then((response) =&amp;gt; response.json())
      .then((data) =&amp;gt; setResult(
        data.results.map((item) =&amp;gt; {
          fetch(item.url)
            .then((response) =&amp;gt; response.json())
            .then((allpokemon) =&amp;gt; arr.push(allpokemon));
          setPoke(arr);
        }),
      ));
  }, []);
  setTimeout(() =&amp;gt; {
    setLoad(false);
  }, 1000);
  return (
    &amp;lt;div className='container'&amp;gt;
      &amp;lt;Header /&amp;gt;

      &amp;lt;CharacterGrid poke={poke} /&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}
export default App;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;Header.js&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React from 'react'
import logo from '../../img/logo.png'

const Header = () =&amp;gt; {
  return (
    &amp;lt;header className='center'&amp;gt;
      &amp;lt;img src={logo} alt='' /&amp;gt;
    &amp;lt;/header&amp;gt;
  )
}

export default Header

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;CharacterGrid.js&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React from 'react'
import CharacterItem from './CharacterItem'
import Spinner from '../ui/Spinner'

const CharacterGrid = ({ poke, isLoading }) =&amp;gt; {
  return isLoading ? (
    &amp;lt;Spinner /&amp;gt;
  ) : (
    &amp;lt;section className='cards'&amp;gt;
      {poke.map((item) =&amp;gt; (
        &amp;lt;CharacterItem key={item.id} item={item}&amp;gt;&amp;lt;/CharacterItem&amp;gt;
      ))}
    &amp;lt;/section&amp;gt;
  )
}

export default CharacterGrid
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;CharacterItem.js&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React from 'react'

const CharacterItem = ({ item }) =&amp;gt; {
  return (
    &amp;lt;div className='card'&amp;gt;
      &amp;lt;div className='card-inner'&amp;gt;
        &amp;lt;div className='card-front'&amp;gt;
          &amp;lt;img src={item.sprites.other.dream_world.front_default} alt='' /&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;div className='card-back'&amp;gt;
          &amp;lt;h1&amp;gt;{item.name}&amp;lt;/h1&amp;gt;
          &amp;lt;ul&amp;gt;
            &amp;lt;li&amp;gt;
              &amp;lt;strong&amp;gt;Hp:&amp;lt;/strong&amp;gt; {item.stats[0].base_stat}
            &amp;lt;/li&amp;gt;
            &amp;lt;li&amp;gt;
              &amp;lt;strong&amp;gt;Experience:&amp;lt;/strong&amp;gt; {item.base_experience}
            &amp;lt;/li&amp;gt;
            &amp;lt;li&amp;gt;
              &amp;lt;strong&amp;gt;attack:&amp;lt;/strong&amp;gt; {item.stats[1].base_stat}
            &amp;lt;/li&amp;gt;
            &amp;lt;li&amp;gt;
              &amp;lt;strong&amp;gt;Special:&amp;lt;/strong&amp;gt; {item.stats[2].base_stat}
            &amp;lt;/li&amp;gt;
            &amp;lt;li&amp;gt;
              &amp;lt;strong&amp;gt;Defence:&amp;lt;/strong&amp;gt; {item.stats[3].base_stat}
            &amp;lt;/li&amp;gt;
          &amp;lt;/ul&amp;gt;
        &amp;lt;/div&amp;gt;

      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  )
}

export default CharacterItem
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Results&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7IS0bNdx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tt34fzpo9aaeapn2skuh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7IS0bNdx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tt34fzpo9aaeapn2skuh.png" alt="Image description" width="880" height="585"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DUnidlFr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z41h6dtpwsem4hz9zqu2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DUnidlFr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z41h6dtpwsem4hz9zqu2.png" alt="Image description" width="880" height="495"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Download the project to test the applied styles, I hope it helps you&lt;/p&gt;

</description>
      <category>react</category>
      <category>api</category>
      <category>javascript</category>
      <category>pokemon</category>
    </item>
    <item>
      <title>Restringir o bloquear elementos en django, hacer que se logueen para mostrarlo.</title>
      <dc:creator>Rodrigo Lazo </dc:creator>
      <pubDate>Wed, 22 Dec 2021 20:33:03 +0000</pubDate>
      <link>https://dev.to/rodrigolazo/restringir-o-bloquear-elementos-en-django-hacer-que-se-logueen-para-mostrarlo-4km2</link>
      <guid>https://dev.to/rodrigolazo/restringir-o-bloquear-elementos-en-django-hacer-que-se-logueen-para-mostrarlo-4km2</guid>
      <description>&lt;p&gt;Hola, ¿cómo están?, en esta ocasión les estaré mostrado como restringir o bloquear elementos en django, solo los usuarios que iniciaron sesión podrán ver los elementos bloqueados.&lt;/p&gt;

&lt;p&gt;Si deseamos exigir que el usuario este iniciado sesión para mostrar una acción o funcionalidad debemos realizar los siguientes pasos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;En &lt;strong&gt;views.py&lt;/strong&gt; importamos una librería &lt;br&gt;
&lt;code&gt;from django.contrib.auth.decorators import login_required&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;y insertamos el siguiente código encima o al inicio de la función que se requiera exigir inicio de sesión &lt;em&gt;@login_required(login_url='Direcion ala cual queremos direccionar')&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;*&lt;em&gt;Ejemplo: *&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from django.contrib.auth.decorators import login_required

@login_required(login_url='insertUrl')
def editPost(request, pk):
    post =  Post.objects.get(id=pk)
    form = PostForm(instance=post)
    if request.method == 'POST':
        form = PostForm(request.POST, request.FILES, instance=post)
        if form.is_valid():
            form.save()
        return redirect ('/')    
    context = {'form':form}
    return render (request, 'index.html',context)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;y de esa manera es como bloquemos o restringimos el acceso a cualquier usuario que no este logeado...&lt;/p&gt;

&lt;p&gt;Ahora bien si deseamos no mostrar algún elemento en concreto como un botón, imagen o cualquier otro elemento en un documento &lt;em&gt;.html&lt;/em&gt; se puede realizar utilizando el siguiente código:&lt;br&gt;
&lt;code&gt;{% if request.user.is_authenticated %}&lt;br&gt;
{% endif %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ejemplo:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{% if request.user.is_authenticated %}
&amp;lt;a class="btn btn-sm btn-primary" href="{% url 'editUrl' post.id %}"&amp;gt;Edit&amp;lt;/a&amp;gt;
{% endif %}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Demostración:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qRNDCyM0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qtyizanrneyq8n4jdo0n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qRNDCyM0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qtyizanrneyq8n4jdo0n.png" alt="Image description" width="744" height="386"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En esta imagen no se muestra el botón Edit.&lt;/p&gt;

&lt;p&gt;Pero si no registramos nos mostraba esa opción&lt;br&gt;
Acceder a &lt;a href="http://localhost:8000/admin"&gt;http://localhost:8000/admin&lt;/a&gt; para iniciar sesion&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--amkYIzxJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/swefb9j5ufv33kyt3eug.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--amkYIzxJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/swefb9j5ufv33kyt3eug.png" alt="Image description" width="880" height="361"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Regresamos ala página y nos mostrará la opción&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Vqe9Tx_w--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mwgp3hr2w1mawtjyetyr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Vqe9Tx_w--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mwgp3hr2w1mawtjyetyr.png" alt="Image description" width="707" height="391"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>django</category>
      <category>python</category>
      <category>login</category>
      <category>boquear</category>
    </item>
    <item>
      <title>Como crear un blog en django 4 - 2022</title>
      <dc:creator>Rodrigo Lazo </dc:creator>
      <pubDate>Tue, 21 Dec 2021 16:34:41 +0000</pubDate>
      <link>https://dev.to/rodrigolazo/como-crear-un-blog-en-django-4-2022-1690</link>
      <guid>https://dev.to/rodrigolazo/como-crear-un-blog-en-django-4-2022-1690</guid>
      <description>&lt;p&gt;Hola, ¿qué tal,&lt;br&gt;
en esta ocasión les mostraré como realizar un pequeño blog en django 4 con Ckeditor.&lt;br&gt;
Pueden encontrar el código en el siguiente enlace&lt;br&gt;
&lt;a href="https://github.com/rodrigolazo/blog"&gt;https://github.com/rodrigolazo/blog&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/_C1NlYXNMIo?start=622"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Comandos de ayuda&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pip install virtualenv

virtualenv env
.\env\Scripts\activate 

django-admin startproject myblog
py manage.py startapp  blog

python manage.py makemigrations
python manage.py migrate

python manage.py runserver
py manage.py collectstatic

pip install -r requirements.txt

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>python</category>
      <category>javascript</category>
      <category>django</category>
      <category>blog</category>
    </item>
    <item>
      <title>Crud En Django con Slug, 2022</title>
      <dc:creator>Rodrigo Lazo </dc:creator>
      <pubDate>Mon, 20 Dec 2021 19:13:55 +0000</pubDate>
      <link>https://dev.to/rodrigolazo/crud-en-django-2022-1ga6</link>
      <guid>https://dev.to/rodrigolazo/crud-en-django-2022-1ga6</guid>
      <description>&lt;p&gt;Hoy vamos a crear un crud(Create, Read, Update, Delete) básico en el framework Django&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Requisito&lt;/strong&gt;&lt;br&gt;
Tener Python instalado, en caso de no tenerlo descargue e instale desde su página: &lt;a href="https://www.python.org/" rel="noopener noreferrer"&gt;https://www.python.org/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Instalación&lt;/strong&gt;&lt;br&gt;
Comenzamos instalando el entorno virtual, para ello abrimos cmd(símbolo del sistema) e ingresamos el siguiente comando &lt;em&gt;pip install virtualenv&lt;/em&gt;, una vez instalada de manera global comenzamos con los siguientes paso&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Creamos una carpeta la cual contendrá el proyecto, en mi caso se llamara django-crud&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Abrimos cmd y nos ubicamos en la carpeta creada&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhi54ozf079w3jkl724iy.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhi54ozf079w3jkl724iy.JPG" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Creamos el entorno virtual con el comando &lt;em&gt;virtualenv env&lt;/em&gt;, esto nos sirve para la instalación de dependencias que requiere este crud.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn7m7pwcw9z54g7qme1lx.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn7m7pwcw9z54g7qme1lx.JPG" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Activamos el entorno virtual  con el comando &lt;em&gt;.\env\Scripts\activate&lt;/em&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F58osj2epkacrai7o854o.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F58osj2epkacrai7o854o.JPG" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Instalamos Djando con el siguiente comando &lt;em&gt;pip install Django==4.0&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Creamos el proyecto con el siguiente comando &lt;em&gt;django-admin startproject NombreProyecto&lt;/em&gt;, en mi caso se llamará mycrud&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsmi5oq2oh9ix9t67v7hr.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsmi5oq2oh9ix9t67v7hr.JPG" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Accedemos ala carpeta del proyecto _cd mycrud&lt;/li&gt;
&lt;li&gt;Creamos una aplicación con el comando &lt;em&gt;py manage.py startapp crud&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Levantamos el proyecto con el comando &lt;em&gt;py manage.py runserver&lt;/em&gt;, accedemos ala web &lt;a href="http://localhost:8000/" rel="noopener noreferrer"&gt;http://localhost:8000/&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe44496si1vfycef08ic0.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe44496si1vfycef08ic0.JPG" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configuración settings.py&lt;/strong&gt;&lt;br&gt;
Abrimos nuestro proyecto en nuestro editor de texto Favorito, en mi caso estaré usando Visual Studio Code y abrimos el archivo _settings.py _ para configurar algunas opciones&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffna0dvga48lvqqxtocdx.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffna0dvga48lvqqxtocdx.JPG" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Definimos nuestra aplicación en &lt;strong&gt;INSTALLED_APPS&lt;/strong&gt; agregando el nombre &lt;em&gt;'crud.apps.CrudConfig',&lt;/em&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgu133mv64k9bebkdj63z.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgu133mv64k9bebkdj63z.JPG" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;models.py&lt;/strong&gt;&lt;br&gt;
Abrimos el archivo models.py y creamos nuestro modelo de la siguiente manera&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from django.db import models
from django.utils.text import slugify

class Developer(models.Model):
    name = models.CharField(max_length=50,null=True)
    age = models.IntegerField(null=True,blank=True)
    skill = models.CharField(max_length=50,null=True)
    slug = models.SlugField(null=True, blank=True)

    class Meta:
        verbose_name = 'Developer'
        verbose_name_plural = 'Developers'

    def __str__(self):
        return self.name

    def save(self, *args, **kwargs):
        if self.slug == None:
            slug = slugify(self.name)

            has_slug = Developer.objects.filter(slug=slug).exists()
            count = 1
            while has_slug:
                count += 1
                slug = slugify(self.name) + '-' + str(count) 
                has_slug = Developer.objects.filter(slug=slug).exists()

            self.slug = slug
        super().save(*args, **kwargs)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En este modelo se puede observar sus 4 variables de registro como name, age, skill, slug, este último &lt;em&gt;slug&lt;/em&gt; es la variable que generara nombres únicos para cada registro el cual podrá remplazar al &lt;em&gt;id&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Creamos la migración del modelo con el comando &lt;em&gt;python manage.py makemigrations&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmwddighevnkjrtxls9k4.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmwddighevnkjrtxls9k4.JPG" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Y Migramos con el comando &lt;em&gt;python manage.py migrate&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CRUD Ingresar views.py&lt;/strong&gt;&lt;br&gt;
Para hacer el ingresar en Django nos situamos en archivo &lt;em&gt;views.py&lt;/em&gt; y ingresamos el siguiente código&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from django.shortcuts import render, redirect
from .models import *
from django.contrib import messages

# CRUD DEVELOPERS

#------ Create ------

def createDev(request):
    name = request.POST['nameInput']
    age = request.POST['ageInput']
    skill = request.POST['skillInput']

    developer = Developer.objects.create(
        name=name, age=age, skill=skill)
    messages.success(request, 'User: ' + name +' ¡Save Success !')
    return redirect('/')
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En este código se importan algunos elementos propios de Djando que facilitaran la creación del crud, además de mensajes tipo request para su interacción.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;urls.py&lt;/strong&gt;&lt;br&gt;
Para direccionar las funciones de nuestra vista creamos un archivo con el nombre urls.py bajo la carpeta &lt;strong&gt;crud&lt;/strong&gt; y ingresamos el siguiente código&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from django.urls import path
from . import views

urlpatterns = [

    # Urls Developers
    path('register/', views.createDev),

]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;y en nuestra &lt;strong&gt;urls.py&lt;/strong&gt; principal que esta baja la carpeta de &lt;em&gt;mycrud&lt;/em&gt; se tiene el código de la siguiente manera, misma que indica referencia ala dirección urls de la aplicación crud&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkx86ic622ityofej092v.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkx86ic622ityofej092v.JPG" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Platilla&lt;/strong&gt;&lt;br&gt;
una platilla es la base en la cual se trabajará el proyecto; Bajo la carpeta &lt;em&gt;crud&lt;/em&gt; creamos una carpeta llamada &lt;strong&gt;templates&lt;/strong&gt; en cuál contendrá todos nuestros documentos html y creamos el archivo base.html&lt;br&gt;
con la siguiente estructura&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang="en"&amp;gt;

&amp;lt;head&amp;gt;
    {% load static %}
    &amp;lt;meta charset="UTF-8"&amp;gt;
    &amp;lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&amp;gt;
    &amp;lt;title&amp;gt;{% block title %} {% endblock %}&amp;lt;/title&amp;gt;
    &amp;lt;link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/css/bootstrap.min.css"
        integrity="sha384-TX8t27EcRE3e/ihU7zmQxVncDAy5uIKz4rEkgIXeMed4M0jlfIDPvg6uqKI2xXr2" crossorigin="anonymous"&amp;gt;
    &amp;lt;link rel="stylesheet" href="{% static 'css/style.css' %}"&amp;gt;
&amp;lt;/head&amp;gt;

&amp;lt;body&amp;gt;
    &amp;lt;nav class="navbar navbar-expand-lg navbar-light bg-dark"&amp;gt;
        &amp;lt;a class="navbar-brand" href="#" style="color: white"&amp;gt;Developers&amp;lt;/a&amp;gt;

    &amp;lt;/nav&amp;gt;
    &amp;lt;div class="container py-4"&amp;gt;
        {% block body %}

        {% endblock %}
    &amp;lt;/div&amp;gt;
    &amp;lt;script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"
        integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"&amp;gt;
    &amp;lt;/script&amp;gt;
    &amp;lt;script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"
        integrity="sha384-9/reFTGAW83EW2RDu2S0VKaIzap3H66lZH81PoYlFhbGU+6BZp6G7niu735Sk7lN" crossorigin="anonymous"&amp;gt;
    &amp;lt;/script&amp;gt;
    &amp;lt;script src="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/js/bootstrap.min.js"
        integrity="sha384-w1Q4orYjBQndcko6MimVbzY0tgp4pWB4lZ7lr30WKz0vr/aWKhXdBNmNb5D92v7s" crossorigin="anonymous"&amp;gt;
    &amp;lt;/script&amp;gt;
    &amp;lt;script src="{% static 'js/bntButton.js' %}"&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;

&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;para los archivos css y javascript, bajo el archivo *&lt;em&gt;crud *&lt;/em&gt; se crea una carpeta de nombre static y se tiene los siguientes archivos:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2i336s9t84hwm708dqpd.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2i336s9t84hwm708dqpd.JPG" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
con la siguiente información de cada archivo&lt;/p&gt;

&lt;p&gt;&lt;em&gt;style.css&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;th,
td {
  text-align: center;
  vertical-align: middle;
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;bntButton.js&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(function () {

    const btnDelete = document.querySelectorAll(".btnDelete");

    btnDelete.forEach(btn =&amp;gt; {
        btn.addEventListener('click', (e) =&amp;gt; {
            const confirmacion = confirm('¿Confirm to delete?');
            if (!confirmacion) {
                e.preventDefault();
            }
        });
    });

})();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Formulario&lt;/strong&gt;&lt;br&gt;
Nuestro formulario será la vista en la cual se podrá realizar el registro, para este ejemplar se ingresara desarrolladores o programadores con nombre, edad y habilidad o lenguaje de programación que maneja.&lt;br&gt;
Para ello creamos un documento html en la carpeta &lt;strong&gt;templates&lt;/strong&gt; en este caso se llamará &lt;em&gt;index.html&lt;/em&gt; con la siguiente información&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{% extends "./base.html" %}

{% block title %} Form {% endblock %}

{% block body %}
&amp;lt;div class="row"&amp;gt;
    &amp;lt;div class="col-sm-12 col-md-6 col-lg-4 col-xl-4"&amp;gt;
        {% if messages %}
        {% for message in messages %}
        &amp;lt;div class="alert alert-dismissible alert-success"&amp;gt;
            &amp;lt;button type="button" class="close" data-dismiss="alert"&amp;gt;&amp;amp;times;&amp;lt;/button&amp;gt;
            &amp;lt;strong class="text-dark"&amp;gt;{{ message }}&amp;lt;/strong&amp;gt;
        &amp;lt;/div&amp;gt;
        {% endfor %}
        {% endif %}
        &amp;lt;h2&amp;gt;Form&amp;lt;/h2&amp;gt;
        &amp;lt;div class="card"&amp;gt;
            &amp;lt;div class="card-body"&amp;gt;
                &amp;lt;form action="/register/" method="POST"&amp;gt;{% csrf_token %}
                    &amp;lt;div class="form-group"&amp;gt;
                        &amp;lt;input type="text" id="nameInput" name="nameInput" class="form-control" placeholder="Name"
                            required&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class="form-group"&amp;gt;
                        &amp;lt;input type="number" id="ageInput" name="ageInput" class="form-control" placeholder="Age"
                            maxlength="50" required&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class="form-group"&amp;gt;
                        &amp;lt;input type="text" id="skillInput" name="skillInput" class="form-control" min="1" max="9"
                        placeholder="Skill" required&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class="form-group"&amp;gt;
                        &amp;lt;button type="submit" class="btn btn-info btn-block text-white"&amp;gt;Save&amp;lt;/button&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/form&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;

&amp;lt;/div&amp;gt;
{% endblock %}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Levantamos el servicio en cmd &lt;em&gt;python manage.py runserver&lt;/em&gt;&lt;br&gt;
y tenemos el siguiente resultado&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjk9bsp8v7xwiaatg7t0b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjk9bsp8v7xwiaatg7t0b.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Realizamos un registro&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faq99k04shtvwf9oqe07y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faq99k04shtvwf9oqe07y.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Resultado&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxxy8ga4aqan0tfrxhbp8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxxy8ga4aqan0tfrxhbp8.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ahora bien nos toca mostrar, editar y eliminar para ello realizamos los siguientes cambios en cada uno de los archivos que les menciona.&lt;br&gt;
&lt;strong&gt;views.py&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from django.shortcuts import render, redirect
from .models import *
from django.contrib import messages


# CRUD DEVELOPERS

#------ Create ------

def createDev(request):
    name = request.POST['nameInput']
    age = request.POST['ageInput']
    skill = request.POST['skillInput']

    developer = Developer.objects.create(
        name=name, age=age, skill=skill)
    messages.success(request, 'User: ' + name +' ¡Save Success !')
    return redirect('/')


#------ List ------
def listDev(request):
    developers = Developer.objects.all()
    return render(request, "index.html", {"developers": developers})


#------ Edit ------
def editDev(request, slug):
    developer = Developer.objects.get(slug=slug)

    name = request.POST.get('nameInput')
    age = request.POST.get('ageInput')
    skill = request.POST.get('skillInput')
    if request.method == 'POST':

        developer.name = name
        developer.age = age
        developer.skill = skill
        developer.save()
        messages.success(request, 'User: ' + name +' ¡Edit Success!')
        return redirect('/')

    return render (request, "edit.html", {"developer": developer})

#------ Delete ------
def deleteDev(request, slug):
    developer = Developer.objects.get(slug=slug)

    developer.delete()
    messages.success(request, '¡Developer Deleted!')
    return redirect('/')  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;urls.py&lt;/strong&gt; &lt;br&gt;
El que esta bajo la carpeta crud&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from django.urls import path
from . import views

urlpatterns = [

    # Urls Developers
    path('', views.listDev),
    path('register/', views.createDev),
    path('edit/&amp;lt;slug:slug&amp;gt;', views.editDev, name='editUrl'),
    path('delete/&amp;lt;slug:slug&amp;gt;', views.deleteDev, name='deleteUrl'),

]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;index.html&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{% extends "./base.html" %}

{% block title %} Form {% endblock %}

{% block body %}
&amp;lt;div class="row"&amp;gt;
    &amp;lt;div class="col-sm-12 col-md-6 col-lg-4 col-xl-4"&amp;gt;
        {% if messages %}
        {% for message in messages %}
        &amp;lt;div class="alert alert-dismissible alert-success"&amp;gt;
            &amp;lt;button type="button" class="close" data-dismiss="alert"&amp;gt;&amp;amp;times;&amp;lt;/button&amp;gt;
            &amp;lt;strong class="text-dark"&amp;gt;{{ message }}&amp;lt;/strong&amp;gt;
        &amp;lt;/div&amp;gt;
        {% endfor %}
        {% endif %}
        &amp;lt;h2&amp;gt;Form&amp;lt;/h2&amp;gt;
        &amp;lt;div class="card"&amp;gt;
            &amp;lt;div class="card-body"&amp;gt;
                &amp;lt;form action="/register/" method="POST"&amp;gt;{% csrf_token %}
                    &amp;lt;div class="form-group"&amp;gt;
                        &amp;lt;input type="text" id="nameInput" name="nameInput" class="form-control" placeholder="Name"
                            required&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class="form-group"&amp;gt;
                        &amp;lt;input type="number" id="ageInput" name="ageInput" class="form-control" placeholder="Age"
                            maxlength="50" required&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class="form-group"&amp;gt;
                        &amp;lt;input type="text" id="skillInput" name="skillInput" class="form-control" min="1" max="9"
                        placeholder="Skill" required&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class="form-group"&amp;gt;
                        &amp;lt;button type="submit" class="btn btn-info btn-block text-white"&amp;gt;Save&amp;lt;/button&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/form&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;div class="col-sm-12 col-md-6 col-lg-8 col-xl-8"&amp;gt;
        &amp;lt;h1&amp;gt;Developer List&amp;lt;/h1&amp;gt;
        &amp;lt;div class="table-responsive py-2"&amp;gt;
            &amp;lt;table class="table table-striped table-hover"&amp;gt;
                &amp;lt;thead class="bg-info"&amp;gt;
                    &amp;lt;tr class="text-light"&amp;gt;
                        &amp;lt;th&amp;gt;#&amp;lt;/th&amp;gt;
                        &amp;lt;th&amp;gt;Name&amp;lt;/th&amp;gt;
                        &amp;lt;th&amp;gt;Age&amp;lt;/th&amp;gt;
                        &amp;lt;th&amp;gt;Skills&amp;lt;/th&amp;gt;
                        &amp;lt;th colspan="2"&amp;gt; options&amp;lt;/th&amp;gt;
                    &amp;lt;/tr&amp;gt;
                &amp;lt;/thead&amp;gt;
                &amp;lt;tbody&amp;gt;
                    {% for dev in developers %}
                    &amp;lt;tr&amp;gt;
                        &amp;lt;td&amp;gt;{{forloop.counter}}&amp;lt;/td&amp;gt;
                        &amp;lt;td&amp;gt;{{dev.name}}&amp;lt;/td&amp;gt;
                        &amp;lt;td&amp;gt;{{dev.age}}&amp;lt;/td&amp;gt;
                        &amp;lt;td&amp;gt;{{dev.skill}}&amp;lt;/td&amp;gt;
                        &amp;lt;td&amp;gt;&amp;lt;a href="{%  url 'editUrl' dev.slug %}" class="btn btn-info"&amp;gt;Edit&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;
                        &amp;lt;td&amp;gt;&amp;lt;a href="{%  url 'deleteUrl' dev.slug %}" class="btn btn-danger btnDelete"&amp;gt;Delete&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;
                    &amp;lt;/tr&amp;gt;
                    {% endfor %}
                &amp;lt;/tbody&amp;gt;
            &amp;lt;/table&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
{% endblock %}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para el editar creamos otro documento html con el nombre de &lt;strong&gt;edit.html&lt;/strong&gt;, esta bajo la carpeta templates y ingresamos el siguintes codigo&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{% extends "./base.html" %}

{% block title %} Edit {% endblock %}

{% block body %}
&amp;lt;div class="row"&amp;gt;
    &amp;lt;div class="col-md-4 offset-md-4"&amp;gt;
        &amp;lt;h2&amp;gt;Edit&amp;lt;/h2&amp;gt;
        &amp;lt;div class="card"&amp;gt;
            &amp;lt;div class="card-body"&amp;gt;
                &amp;lt;form action="{% url 'editUrl' developer.slug %}"  method="POST"&amp;gt;
                    {% csrf_token %}
                    &amp;lt;div class="form-group"&amp;gt;
                        &amp;lt;input type="text" id="nameInput" name="nameInput" value="{{developer.name}}" class="form-control" placeholder="Name"
                            required&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class="form-group"&amp;gt;
                        &amp;lt;input type="number" id="ageInput" name="ageInput" value="{{developer.age}}" class="form-control" placeholder="Age"
                            maxlength="50" required&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class="form-group"&amp;gt;
                        &amp;lt;input type="text" id="skillInput" name="skillInput" value="{{developer.skill}}" class="form-control"
                        placeholder="Skill"required&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class="form-group"&amp;gt;
                        &amp;lt;button type="submit" class="btn btn-success btn-block text-white"&amp;gt;Edit&amp;lt;/button&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/form&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
{% endblock %}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Con esos cambios ya se tiene el CRUD completo, a continuacion les muestro como queda.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7liu77bty15vxbqsxxx4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7liu77bty15vxbqsxxx4.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Creamos uno&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo17duxwlc5l15t20purf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo17duxwlc5l15t20purf.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Editamos uno&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnhhoedmcpt2kk3fdxcvu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnhhoedmcpt2kk3fdxcvu.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjpacf5wzvb0ecv2p740f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjpacf5wzvb0ecv2p740f.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Slug&lt;/strong&gt;&lt;br&gt;
se puede ver lo que hace el slug que remplaza nuestro id por una valor unico en este caso el nombre, esto ayuda mucho para temas de seguridad ya que con esto se oculta el id ala que pertencese el registro&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Facjvm8wq0g4z848nnneb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Facjvm8wq0g4z848nnneb.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Eliminamos uno&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh46kzy39gjnfda47jm8k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh46kzy39gjnfda47jm8k.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4t7uit24ehaikf3uguwn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4t7uit24ehaikf3uguwn.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Espero que les ayude...&lt;br&gt;
&lt;em&gt;Fuetes:&lt;/em&gt;&lt;br&gt;
&lt;a href="https://docs.djangoproject.com/en/4.0/" rel="noopener noreferrer"&gt;https://docs.djangoproject.com/en/4.0/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=iQcJPeCcjNo&amp;amp;t=1585s" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=iQcJPeCcjNo&amp;amp;t=1585s&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=uSbDMs7Y9yI&amp;amp;t=189s" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=uSbDMs7Y9yI&amp;amp;t=189s&lt;/a&gt;&lt;/p&gt;

</description>
      <category>django</category>
      <category>crud</category>
      <category>slug</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
