#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 Humphreys2. @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}}
измените «опубликовать» в теге формы на «ОПУБЛИКОВАТЬ».
надеюсь, это сработает, дайте мне знать, если вы их пробовали