Czesc wszystkim.
Jest to moj pierwszy post. Zaczalem przygode z Django i napotkalem pierwszy problem w zwiazku z czym bardzo prosze o pomoc :)
Z poziomu administratora w Django jestem w stanie ladowac zdjęcia na serwer, jednak z formularza na stronie jest to niemożliwe.
Jedyne zdjęcie, które można przesłać za pomoca formularza, to domyślne zdjęcie, które ustawiłem w pliku models (default="user.jpg").
Jeśli usunę opcje domyślnego zdjęcia z models i zaladuje dowolne zdjęcie za pomoca formularza to wyskakuje ponizszy błąd:
Error during template rendering
The 'image' attribute has no file associated with it.
error at line 10
3 {% block content %}
4 {% for post in posts %}
5 <div class="post">
6 <div class="data">
7 <p>Published: {{ post.publish_date }}</p>
8 </div>
9 <h2><a href="{% url 'post_detail' pk=post.pk %}">{{ post.title }}</a></h2>
10 <img src="{{ post.image.url }}" alt="Image" width="100">
11 <em>{{ post.text|linebreaksbr }}</em>
12 </div>
13 {% endfor %}
14 {% endblock %}
Zamieszczam ponizej zawartosc najwazniejszych plikow skladajacych sie na cala aplikacje:
models.py
class Post(models.Model):
author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
title = models.CharField(max_length=200)
text = models.TextField()
created_date = models.DateTimeField(default=timezone.now)
publish_date = models.DateTimeField(blank=True, null=True)
image = models.ImageField(upload_to='images/', blank=True, null=True, default='images/user.jpg')
def publish(self):
self.publish_date = timezone.now()
self.save()
def __str__(self):
return self.title
views.py
class Image(TemplateView):
form = PostForm
template_name = 'blog/image.html'
def post(self, request, *args, **kwargs):
form = PostForm(request.POST, request.FILES)
if form.is_valid():
obj = form.save()
return HttpResponseRedirect(reverse_lazy('image_display', kwargs={'pk': obj.id}))
context = self.get_context_data(form=form)
return self.render_to_response(context)
def get(self, request, *args, **kwargs):
return self.post(request, *args, **kwargs)
class ImageDisplay(DetailView):
model = Post
template_name = 'blog/image_display.html'
context_object_name = 'image'
def post_list(request):
posts = Post.objects.filter(publish_date__lte=timezone.now()).order_by('publish_date')
return render(request, 'blog/post_list.html', {'posts': posts})
def post_detail(request, pk):
post = get_object_or_404(Post, pk=pk)
return render(request, 'blog/post_detail.html', {'post': post})
def error_404_view(request, exception):
data = {"name": "Blog for programmers"}
return render(request, 'blog/404.html', data)
def post_new(request):
if request.method == "POST":
form = forms.PostForm(request.POST, request.FILES)
if form.is_valid():
post = form.save(commit=False)
post.author = request.user
post.publish_date = timezone.now()
post.save()
return redirect('post_detail', pk=post.pk)
else:
form = PostForm()
return render(request, 'blog/post_edit.html', {'form': form})
forms.py
class PostForm(forms.ModelForm):
class Meta:
model = Post
fields = ['title', 'text', 'image']
post_detail.html
{% block content %}
<div class="post">
{% if post.published_date %}
<div class="date">
{{ post.published_date }}
</div>
{% endif %}
<h2>{{ post.title }}</h2>
<img src="{{ post.image.url }}" alt="Image" width="250">
<p>{{ post.text|linebreaksbr }}</p>
</div>
{% endblock %}
post_list.html
{% block content %}
{% for post in posts %}
<div class="post">
<div class="data">
<p>Published: {{ post.publish_date }}</p>
</div>
<h2><a href="{% url 'post_detail' pk=post.pk %}">{{ post.title }}</a></h2>
<img src="{{ post.image.url }}" alt="Image" width="100">
<em>{{ post.text|linebreaksbr }}</em>
</div>
{% endfor %}
{% endblock %}