Tworzę sobie taką prostą stronkę w Django. Ma to być sklep internetowy. Utworzyłem formularz dodawania przedmiotu, w którym nie działa niestety przesyłanie zdjęć - poprzez panel admina mogę je dodać, przez formularz nie za bardzo.
forms.py
from django import forms
from .models import Item
class ItemForm(forms.ModelForm):
class Meta:
model = Item
fields = ('title', 'category', 'price', 'img',)
urls.py
from django.contrib import admin
from django.urls import path
from . import views
urlpatterns = [
path('', views.homepage, name='homepage'),
path('item/<int:pk>', views.item_details, name='item_details'),
path('item/new', views.item_new, name='item_new'),
]
views.py
from django.shortcuts import render, get_object_or_404, redirect
from .models import Item, Category
from django.utils import timezone
from .forms import ItemForm
def homepage(request):
items = Item.objects.filter(published_date__lte=timezone.now()).order_by('published_date')
return render(request, 'shop/homepage.html', {'items': items})
def item_details(request, pk):
item = get_object_or_404(Item, pk=pk)
return render(request, 'shop/item_details.html', {'item': item})
def item_new(request):
if request.method == "POST":
form = ItemForm(request.POST)
if form.is_valid():
item = form.save(commit=False)
item.seller = request.user
item.published_date = timezone.now()
item.save()
return redirect('item_details', pk=item.pk)
else:
form = ItemForm()
return render(request, 'shop/item_edit.html', {'form': form})
item_edit.html
{% extends 'shop/base.html' %}
{% block content %}
<h1>New post</h1>
<form method="POST" class="post-form">{% csrf_token %}
{{ form.as_p }}
<button type="submit" class="save btn btn-default">Save</button>
</form>
{% endblock %}
base.html
{% load static %}
<!doctype html>
<html lang='pl'>
<head>
<meta charset="utf-8">
<title>MyShop - Simple Django Shopping site</title>
<link rel="stylesheet" href="{% static 'css/style.css' %}">
</head>
<body>
<div id="container">
<div id="header">
<div class="left-header">
<a href="/"><p>MyShop</p>
<p>Simple Django Shopping site</p></a>
</div>
<div class="center-header">
<input type="text" class="search" name="q"> <input type="submit" class="submit" value="Search">
</div>
<div class="right-header">
{% if user.is_authenticated %}
Hello {{ user.username }} </br>
<a href="{% url 'accounts:user_details' pk=user.pk %}">User Profile</a></br>
<a href="{% url 'logout' %}">Logout</a></br>
<p><a href="{% url 'item_new' %}">Add item</a></p>
{% else %}
Hello Anon! </br>
<a href="{% url 'login' %}">Login</a> or <a href="{% url 'accounts:signup' %}">Register</a>
{% endif %}
</div>
</div>
{% block content %}
{% endblock %}
</body>
</html>
models.py
from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
class Category(models.Model):
title = models.CharField(max_length=100)
description = models.TextField()
def __str__(self):
return self.title
class Item(models.Model):
seller = models.ForeignKey(User, on_delete=models.CASCADE)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
title = models.CharField(max_length=100)
price = models.FloatField(null=False, blank=False)
img = models.ImageField(blank=True, null=True,
upload_to='covers/%Y/%m/%D/')
published_date = models.DateTimeField(default=timezone.now)
def __str__(self):
return self.title
Co zrobiłem nie tak?