Форма отправки файла Django не будет сохранена в моделях через интерфейс

#python #django #django-models #django-views #django-forms

Вопрос:

Таким образом, цель состоит в том, чтобы заставить пользователя загружать изображения внутри приложения и отображать их на экране.

Проблема в том, что формы не будут сохранены в моделях, которые я сделал. Я слежу за Центральным Джанго https://djangocentral.com/uploading-images-with-django/ для руководства по загрузке моих изображений.

На данный момент у меня есть место, где пользователь может ввести в форму свою подпись и где пользователь может выбрать файл для своего изображения, но ничего не происходит, когда он нажимает кнопку «Загрузить». Все, что происходит, это то, что он по какой-то причине перенаправляет меня на домашнюю страницу, но я могу исправить это позже. Единственный способ отображения изображений на веб-сайте-это вручную зайти в панель администратора и загрузить изображение туда. Если бы кто-нибудь мог помочь, я был бы очень признателен.

view.py

 def profile(request):
    if request.method == "POST":
        form = User_Profile_Form(data = request.POST, files = request.FILES)
        if form.is_valid():
            form.save()
            obj = form.instance
            return render(request, "main/profile.html", {"obj":obj})
    else:
        form = User_Profile_Form()
    img = User_Profile.objects.all()
    return render(request,"main/profile.html", {"img":img, "form":form})
 

models.py

 class User_Profile(models.Model):
    caption = models.CharField(max_length = 100)
    image = models.ImageField(upload_to = "img/%y", blank=True)

    def __str__(self):
        return self.caption
 

forms.py

 from django import forms
from .models import User_Profile

class User_Profile_Form(forms.ModelForm):
    class Meta:
        model = User_Profile
        fields = ("caption", "image")
 

profile.html

                 <div class="container">
                    <form action="." method="post" enctype="multipart/form-data">
                        {% csrf_token %}
                        {{form.as_p}}
                        <button type="submit" class="btn btn-lg btn-success">Upload</button>
                    </form>

                    {% if obj %}
                    <h3>Succesfully uploaded : {{img_obj.caption}}</h3>
                    <img src="{{ obj.image.url}}" alt="image" class="img-thumbnail" >
                    {% endif %}
                    <hr>


                    {% for x in img %}
                    {% if forloop.first %}<div class="row ">{% endif %}
                        <div class="col-lg-4 col-md-4 col-12" >
                    <div class="text-center mt-2">
                        <img src="{{x.image.url}}" height="70%" width="70%" class="img-thumbnail" alt="...">
                        <h2 class="text-center" >{{x.caption}}</h2></div>
                        </div>
                        {% if forloop.counter|divisibleby:3 %}
                    </div>
                    <div class=row>{% endif %}
                        {% if forloop.last %}</div>{% endif %}

                    {% endfor %}
                </div>
 

Комментарии:

1. Можете ли вы поделиться шаблоном? Тоже form.is_valid() возвращается True ?

2. Я только что добавил свой html-код, и есть ли способ узнать, возвращает ли он значение True, например, если бы я использовал консоль? @bdbd

3. Я думаю, что инструкций печати будет достаточно, если вы используете это локально. Вы можете увидеть вывод с вашего терминала или IDE

4. Я забыл, что ты мог бы это сделать, хотя терминал работает, спасибо тебе, парень, работай умнее, а не усерднее.

Ответ №1:

В шаблоне измените действие: с:

 <form action="." method="post" enctype="multipart/form-data">
 

Для:

 <form action="" method="post" enctype="multipart/form-data">
 

. перенаправляет вас на домашнюю страницу.

в views.py

 def profile(request):
    if request.method == "POST":
        form = User_Profile_Form(data = request.POST, files = request.FILES)
        if form.is_valid():
            form.save()
            obj = form.instance
            return render(request, "main/profile.html", {"obj":obj, "form":form})
    else:
        form = User_Profile_Form()
    img = User_Profile.objects.all()
    return render(request,"main/profile.html", {"img":img, "form":form})
 

Комментарии:

1. Опередите меня 😉 если это не сработает, попробуйте установить действие на URL profile @Anthony Humphreys

2. @bdbd Код работал, но я хотел сделать еще один шаг вперед, чтобы в будущем мне было проще реализовывать другие функции. С помощью функции просмотра над «профилем» эта функция отображает страницу и загружает изображение, и я хотел бы иметь две отдельные функции, в которых одна отображает страницу, а другая загружает изображение, но когда я это делаю, форма исчезает. Поэтому я попытался сделать функцию image_upload URL-адресом, чтобы я мог вызвать ее в действии, как вы сказали выше. Но это не сработало, какие-нибудь советы?

3. Похоже, это должен быть новый вопрос. В противном случае, можете ли вы обновить свой вопрос с помощью текущего кода, который у вас есть? Трудно понять, что didn't work это значит. Каков фактический результат и чего вы ожидаете?

4. @AnthonyHumphreys форма не исчезнет, если вы передадите форму после ее сохранения. используйте это return render(request, "main/profile.html", {"obj":obj , "form":form})

5. @Jafoor Подождите, я немного сбит с толку, я попробовал это на всех трех моих функциях в view.py и это не сработало. Где именно я снова напишу функцию возврата рендеринга. Извините.

Ответ №2:

я знаю, что вы хотите сделать, я сделал это в своем проекте, вот мой код, отредактированный для вас

views.py

 pimageupdate = ProfileImageUpdate(request.POST,request.FILES, instance=request.user.userprofile)
        if pimageupdate.is_valid():
            pimageupdate.save()
 

должен ли я отметить, что pimageupdate получает форму из forms.py

и вы должны добавить пользователя в свой {{}} код следующим образом

 {{user.userprofile.default_profile_picture}}
 

измените «опубликовать» в теге формы на «ОПУБЛИКОВАТЬ».

надеюсь, это сработает, дайте мне знать, если вы их пробовали