Как разместить фотографии на django? - PullRequest
2 голосов
/ 29 апреля 2020

Я пытался сделать так, чтобы мой код мог публиковать изображения, но когда я создаю сообщение, изображение не появляется, но изображение сохраняется на носителях / изображениях. Мне было интересно, есть ли способ заставить код работать, или может быть что-то не так в базе. html когда я вызываю изображение {{request.user.image.url}}

views.py

     def create(request):
        if request.method == 'POST':
            created_date = timezone.now()
            header1 = request.POST['header']
            content1 = request.POST['content']
            user = request.user
            uploded_file = request.FILES['image']
            created_obj = Create.objects.create(added_date=created_date, title=header1, content=content1, user=user, image=uploded_file)
            created_obj.save()
            print('create created')
            return redirect('home')
        else:
            print('create not created')
            return render(request, 'create.html')

models.py

    class Create(models.Model):
        added_date = models.DateTimeField()
        title = models.CharField(max_length=200)
        content = models.CharField(max_length=200)
        image = models.ImageField(null=True, blank=True, upload_to='images/')
        user = models.ForeignKey(User, related_name='user', on_delete=models.CASCADE, default=1)

    class Profile(models.Model):
        user = models.OneToOneField(User, on_delete=models.CASCADE)
        image = models.ImageField(default='default.jpg', upload_to='profile_pics')

        def __str__(self):
            return f'{self.user.username} Profile'

создать. html

    {% extends 'home.html' %}
    {% block body %}
    <div style="margin-top: 200px; margin-left:200px;">
        <form action="create" method="POST" enctype="multipart/form-data">
            {% csrf_token %}
            <input type="text" name="header" placeholder="Add here...">
            <input type="text" name="content" placeholder="Add here...">
            <input type="file" name="image">
            <button type="submit"name="action" class="btn btn-primary mb-2">submit</button>
        </form>
    </div>
    {% endblock %}

база. html

    {% extends 'home.html' %}
    {% block body %}
    <ul action="{% url 'create' %}" class="container-sm list-group" style="margin-top: 200px;">
        {% for created_post in created_posts %}
        <li class="list-group-item">{{ created_post.title }}
          <a href="{% url 'profile_pk' pk=created_post.user.pk %}">{{ created_post.user }}</a>
          <img class="image" src="{{ create.image.url }}">
          <p>{{ created_post.content }}</p>
          <div class="float-right">
            <form action="delete_create/{{ created_post.id }}/" action="post">
              <button type="submit" class="btn btn-outline-danger btn-sm">Delete</button>
            </form>
          </div>
          <div class="float-right">
            <a href="{% url 'edit' created_post.id %}" class="btn btn-outline-warning btn-sm" style="margin-right: 5px;" role="button">Edit</a>
          </div>
        </li>     
        {% endfor %}            
    </ul>
    {% endblock %}

1 Ответ

1 голос
/ 29 апреля 2020

На большинстве веб-сайтов мы часто имеем дело с мультимедийными данными, такими как изображения, файлы и т. Д. c. В django мы можем работать с изображениями с помощью поля модели, которое называется ImageField.

В этой статье мы создали приложение image_app в примере проекта с именем image_upload.

Самый первый шаг - добавить приведенный ниже код в файл settings.py.

filter_none
brightness_4
MEDIA_ROOT =  os.path.join(BASE_DIR, 'media') 
MEDIA_URL = '/media/'

MEDIA_ ROOT - путь к серверу для хранения файлов на компьютере. MEDIA_URL является ссылочным URL для браузера, чтобы получить доступ к файлам через Http.

В urls.py мы должны отредактировать конфигурацию следующим образом:

if settings.DEBUG:

urlpatterns + = stati c (settings.MEDIA_URL, document_root = settings.MEDIA_ ROOT)

Пример файла models.py должен быть таким, поскольку мы создали модель отеля, которая состоит из названия отеля и его изображение. В этом проекте мы берем имя отеля и его изображение от пользователя для сайта бронирования отелей.

filter_none
brightness_4
# models.py 
 class Hotel(models.Model): 
    name = models.CharField(max_length=50) 
    hotel_Main_Img = models.ImageField(upload_to='images/') 
//Here upload_to will specify, to which directory the images should reside, by default django creates the directory under media directory which will be automatically created when we upload an image. No need of explicit creation of media directory.

Мы должны создать файл forms.py в image_app, здесь мы имеем дело с формой модели, чтобы сделать содержимое легче понять.

filter_none
brightness_4
# forms.py 
from django import forms 
from .models import *



class HotelForm(forms.ModelForm): 

    class Meta: 
        model = Hotel 
        fields = ['name', 'hotel_Main_Img'] 

Django будет неявно обрабатывать проверку формы без явного объявления в скрипте, и будет создавать аналогичные поля формы на странице в соответствии с полями модели, которые мы указали в файл models.py. Это преимущество формы модели.

Теперь создайте каталог шаблонов под image_app, в котором мы должны создать файл html для загрузки изображений. Файл HTML должен выглядеть следующим образом.

filter_none
edit
play_arrow

brightness_4
<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <title>Hotel_image</title> 
</head> 
<body> 
    <form method = "post" enctype="multipart/form-data"> 
        {% csrf_token %} 
        {{ form.as_p }} 
        <button type="submit">Upload</button> 
    </form> 
</body> 
</html> 

При выполнении запроса POST мы должны каким-то образом кодировать данные, которые формируют тело запроса. Итак, мы должны указать формат кодировки в теге формы. multipart / form-data значительно сложнее, но позволяет включать в данные целые файлы.

csrf_token предназначен для защиты от подделок межсайтовых запросов.

form.as_p просто переносит все элементы в HTML тегах абзаца. Преимущество заключается в том, что в шаблоне не нужно писать al oop для явного добавления HTML для окружения каждого заголовка и поля.

В файле views.py под image_app мы должны написать представление для взятия запрашивает у пользователя и возвращает некоторую страницу html.

filter_none
brightness_4
from django.http import HttpResponse 
from django.shortcuts import render, redirect 
from .forms import *

# Create your views here. 
def hotel_image_view(request): 

    if request.method == 'POST': 
        form = HotelForm(request.POST, request.FILES) 

        if form.is_valid(): 
            form.save() 
            return redirect('success') 
    else: 
        form = HotelForm() 
    return render(request, 'hotel_image_form.html', {'form' : form}) 




def success(request): 
    return HttpResponse('successfully uploaded') 

всякий раз, когда срабатывает hotel_image_view и этот запрос POST, мы создаем экземпляр формы модели form = HotelForm (request.POST, request.FILES ) изображение будет сохранено по запросу. ФАЙЛЫ. Если это действительно так, сохраните в базу данных и перенаправьте на URL-адрес успеха, который указывает на успешную загрузку изображения. Если метод не POST, мы выполняем рендеринг с созданным шаблоном html.

urls.py будет выглядеть так -

filter_none
brightness_4
from django.contrib import admin 
from django.urls import path 
from django.conf import settings 
from django.conf.urls.static import static 
from .views import *

urlpatterns = [ 
    path('image_upload', hotel_image_view, name = 'image_upload'), 
    path('success', success, name = 'success'), 
] 

if settings.DEBUG: 
        urlpatterns += static(settings.MEDIA_URL, 
                              document_root=settings.MEDIA_ROOT) `enter code here`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...