Hello,
With these models of Post and Images, I want to display and edit/delete the
images along with the fields of the post. I have just added the Images
model so I can have its fields in a Formset but the implementation of Model
Formsets has challenged me.
class Post(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
date_posted = models.DateTimeField(default=timezone.now)
author = models.ForeignKey(User, on_delete=models.CASCADE)
price = models.IntegerField(validators=[MinValueValidator(10
), MaxValueValidator(10000000)], default=10,
help_text="Enter in Dollars, $.")
featured = models.BooleanField(default=False)
active = models.BooleanField(default=True)
propertyType = models.CharField(max_length=120, choices=TYPE_CHOICES,
validators=[
validate_propertyType], default='Villa'
,)
area = models.DecimalField(decimal_places=2, max_digits=20,
null=True, blank=True,
help_text=
"Enter in Acres. Hint: 100 decimals = 1 acre = 0.405 hectares, 1 Sq.
mile = 640 Acres, 1 decimal = 436 sq. feet = 40.5 sq. metres = 0.001
acres."
)
bedrooms = models.SmallIntegerField(choices=BEDROOMS_CHOICES,
null=True, blank=True)
baths = models.SmallIntegerField(choices=BATHROOMS_CHOICES,
null=True, blank=True)
garages = models.SmallIntegerField(choices=GARAGES_CHOICES, null=
True, blank=True)
location = models.CharField(
max_length=120, null=True, help_text=
"Enter a Town/City where your Property is located.")
propertyStatus = models.CharField(
max_length=120, choices=STATUS_CHOICES, validators=
[validate_propertyStatus], default='Sale')
amenities = models.TextField(null=True, blank=True,
help_text=
"Enter separating with commas, e.g: Parking, Balcony, Swimming Pool,
Tennis Courts, Outdoor Kitchen, Internet, Cable T.V, Concrete
Flooring, ..."
)
slug = models.SlugField(null=True, blank=True)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('post-detail', kwargs={'pk': self.pk})
def get_image_filename(instance, filename):
title = instance.post.title
slug = slugify(title)
return "properties_pics/%s-%s" % (slug, filename)
class Images(models.Model):
post = models.ForeignKey(Post, on_delete=models.CASCADE,
default=None)
propertyImages = models.ImageField(
default="default.jpg", upload_to=get_image_filename,
help_text=
" We must provide a clear Picture, preferably Landscape, not Portrait!")
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
img = Image.open(self.propertyImages.path)
if img.height > 800 or img.width > 600:
output_size = (600, 800)
img.thumbnail(output_size)
img.save(self.propertyImages.path)
Here is my Views.py, works well before the Formsets;
class PostListView(ListView):
model = Post
template_name = "maproperty/home.html" # <app>/<model>_<viewtype>.html
context_object_name = "posts"
odering = ["date_posted"]
paginate_by = 5
class UserPostListView(ListView):
model = Post
template_name = "maproperty/user_posts.html"
# <app>/<model>_<viewtype>.html
context_object_name = "posts"
paginate_by = 6
#filter a post from a certain user, modify the querry set by
overidding this method
def get_queryset(self):
#get user associated with the username we gonna get from the url.
user =get_object_or_404(User, username=self.kwargs.get('username'))
return Post.objects.filter(author=user).order_by('-date_posted')
class SaleListView(ListView):
model = Post
class RentListView(ListView):
model = Post
class BookingListView(ListView):
model = Post
class PostDetailView(DetailView):
model = Post
class PostCreateView(LoginRequiredMixin, CreateView):
model = Post
fields = ['title','content', 'price', 'propertyImage', 'propertyType',
'area', 'bedrooms', 'baths', 'garages',
'location', 'propertyStatus', 'amenities']
def form_valid(self, form):
form.instance.author = self.request.user
return super().form_valid(form)
class PostUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
model = Post
fields = ['title','content', 'price', 'propertyImage', 'propertyType',
'area', 'bedrooms', 'baths', 'garages',
'location', 'propertyStatus', 'amenities']
def form_valid(self, form):
form.instance.author = self.request.user
return super().form_valid(form)
def test_func(self):
post = self.get_object()
if self.request.user == post.author:
return True
return False
class PostDeleteView(LoginRequiredMixin, UserPassesTestMixin, DeleteView):
model = Post
success_url = '/'
def test_func(self):
post = self.get_object()
if self.request.user == post.author:
return True
return False
def about(request):
return render(request, "maproperty/about.html", {"title": "About"})
def contact(request):
return render(request, "maproperty/contact_page.html", {"title":
"Contact"})
Thank you.
*Richard Dick Balwane*
*Mobiles: +256 755 442248, *
* +256 781 493558.*
*Twiter: @RBalwane*
*WhatsApp: **+256 755 442248*
*Balwane Holding Inc.*
<http://www.avg.com/email-signature?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=webmail>
Virus-free.
www.avg.com
<http://www.avg.com/email-signature?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=webmail>
<#DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2>
--
You received this message because you are subscribed to the Google Groups
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-users/CAAjYwK80PJ%3DajVBomp3VfHs5kRpYA5Hcvu8cteP6MxXk161c0Q%40mail.gmail.com.