美文网首页
Try DJANGO Tutorial -- Part III

Try DJANGO Tutorial -- Part III

作者: c8ac4dad76db | 来源:发表于2018-09-11 13:14 被阅读24次

    21. Render Data from the Database with a Model

    (.venv) > $ python manage.py shell
    [GCC 7.3.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    (InteractiveConsole)
    >>> from products.models import Product
    >>> Product.objects.get(id=1)
    <Product: Product object (1)>
    >>> obj = Product.objects.get(id=1)
    >>> obj.title
    'New product 1'
    >>> obj.summary
    'sweet'
    

    products/views.py:

    from django.shortcuts import render
    
    from .models import Product
    
    
    def product_detail_view(request):
        obj = Product.objects.get(id=1)
        context = {
            'object': obj
        }
        return render(request, "product/detail.html", context)
    

    trydjango/urls.py:

    from products.views import product_detail_view
    
    urlpatterns = [
        # ...
        path('product/', product_detail_view),
    ]
    

    templates/product/detail.html:

    {% extends "base.html" %}
    
    {% block content %}
        <h1>{{ object.title }}</h1>
        <p>
        {% if object.description %}
            {{ object.description }}
        {% else %}
            Coming Soon ...
        {% endif %}
        </p>
    
    {% endblock %}
    

    22. How Django Templates Load with Apps

    mkdir -p /products/templates/products
    mv templates/product/detail.html products/templates/products/product_detail.html
    

    products/views.py:

    # ...
    def product_detail_view(request):
        obj = Product.objects.get(id=1)
        context = {
            'object': obj
        }
        return render(request, "products/product_detail.html", context)
    

    23. Django Model Forms

    products/forms.py:

    from django import forms
    
    from .models import Product
    
    
    class ProductForm(forms.ModelForm):
        class Meta:
            model = Product
            fields = [
                'title', 'description', 'price'
            ]
    

    products/templates/product_create.html:

    {% extends "base.html" %}
    
    {% block content %}
      <form method='POST'>
        {% csrf_token %}
        {{ form.as_p }}
        <input type='submit' value='Save'/>
      </form>
    {% endblock %}
    

    trydjango/urls.py:

    from products.views import product_create_view, product_detail_view
    
    urlpatterns = [
        # ...
        path('create/', product_create_view),
    ]
    

    products/views.py:

    # ...
    from .forms import ProductForm
    
    def product_create_view(request):
        form = ProductForm(request.POST or None)
        if form.is_valid():
            form.save()
            form = ProductForm()
    
        context = {
            "form": form
        }
        return render(request, "products/product_create.html", context)
    

    24. Raw HTML Form

    products/templates/product_create.html:

    {% extends "base.html" %}
    
    {% block content %}
      <form method='POST' action=".">
        {% csrf_token %}
        <input type="text" name="title" placeholder="Your title">
        <input type='submit' value='Save'/>
      </form>
    {% endblock %}
    

    products/views.py:

    def product_create_view(request):
        if request.method == "POST":
            my_new_title = request.POST.get('title')
            print(my_new_title)
        context = {}
        return render(request, "products/product_create.html", context)
    
    (.venv) > $ python manage.py runserver                                                                                                   
    System check identified no issues (0 silenced).
    September 10, 2018 - 13:54:08
    Django version 2.1.1, using settings 'trydjango.settings'
    Starting development server at http://127.0.0.1:8000/
    Quit the server with CONTROL-C.
    [10/Sep/2018 13:54:09] "GET /create/ HTTP/1.1" 200 472
    my title
    [10/Sep/2018 13:55:55] "POST /create/ HTTP/1.1" 200 598
    

    25. Pure Django Form

    class RawProductForm(forms.Form):
        title = forms.CharField()
        description = forms.CharField()
        price = forms.DecimalField()
    

    products/views.py:

    # ...
    from .forms import ProductForm, RawProductForm
    
    def product_create_view(request):
        my_form = RawProductForm()
        if request.method == 'POST':
            my_form = RawProductForm(request.POST)
            if my_form.is_valid():
                Product.objects.create(**my_form.cleaned_data)
            else:
                print(my_form.errors)
        context = {"form": my_form}
        return render(request, "products/product_create.html", context)
    
    # ...
    

    products/templates/product_create.html:

    {% extends "base.html" %}
    
    {% block content %}
      <form method='POST' action=".">
        {% csrf_token %}
        {{ form.as_p }}
        <input type='submit' value='Save'/>
      </form>
    {% endblock %}
    

    26. Form Widgets

    products/forms.py:

    # ...
    
    class RawProductForm(forms.Form):
        title = forms.CharField(label="",
                                widget=forms.TextInput(attrs={
                                    "placeholder": "Your title"}))
        description = forms.CharField(required=False,
                                      widget=forms.Textarea(attrs={
                                          "placeholder": "Your description",
                                          "class": "new-class-name two",
                                          "id": "my-id-for-area",
                                          "rows": 8,
                                          "cols": 80
                                      }))
        price = forms.DecimalField(initial=199.99)
    

    27. Form Validation Methods

    products/forms.py:

    # ...
    class ProductForm(forms.ModelForm):
        title = forms.CharField(label="",
                                widget=forms.TextInput(attrs={
                                    "placeholder": "Your title"}))
        description = forms.CharField(required=False,
                                      widget=forms.Textarea(attrs={
                                          "placeholder": "Your description",
                                          "class": "new-class-name two",
                                          "id": "my-id-for-area",
                                          "rows": 8,
                                          "cols": 80
                                      }))
        price = forms.DecimalField(initial=199.99)
    
        class Meta:
            model = Product
            fields = [
                'title', 'description', 'price'
            ]
    
        def clean_title(self, *args, **kwargs):
            title = self.cleaned_data.get("title")
            if not "CFE" in title:
                raise forms.ValidationError("This is not a valid title")
            if not "new" in title:
                raise forms.ValidationError("This is not a valid title")
            return title
    # ...
    

    products/views.py:

    # ...
    def product_create_view(request):
        form = ProductForm(request.POST or None)
        if form.is_valid():
            form.save()
            form = ProductForm()
    
        context = {"form": form}
        return render(request, "products/product_create.html", context)
    
    # ...
    

    28. Initial Values for Forms

    29. Dynamic URL Routing

    products/views.py:

    # ...
    
    def dynamic_lookup_view(request, my_id):
        obj = Product.objects.get(id=my_id)
        context = {
            "object": obj
        }
        return render(request, "products/product_detail.html", context)
    

    trydjango/urls.py:

    # ...
    [
        path('product/<int:my_id>/', dynamic_lookup_view, name="product"),
    ]
    

    30. Handle DoesNotExist

    products/views.py:

    from django.http import Http404
    # ...
    
    def dynamic_lookup_view(request, my_id):
        try:
            obj = Product.objects.get(id=my_id)
        except Product.DoesNotExist:
            raise Http404
        context = {
            "object": obj
        }
        return render(request, "products/product_detail.html", context)
    

    相关文章

      网友评论

          本文标题:Try DJANGO Tutorial -- Part III

          本文链接:https://www.haomeiwen.com/subject/erzlgftx.html