Предположим, я делаю "Как" Веб-приложение Django, где пользователи пишут сообщения о как ... делать разные вещи, например.
- «Как» сделать веревку
- "Как" сделать глиняный горшок
- «Как» научиться ездить на велосипеде
Вы поняли идею. Я сделал пост создания представления для этого. Теперь, когда участники делают пост. Они добавляют дополнительные изображения к посту
Пример: «Как» сделать веревку
- Это имеет заголовок сообщения = Как сделать веревку
- Опубликовать описание = "Некоторое описание"
- Опубликовать изображение = Основное изображение
Теперь им нужно шаг за шагом показывать изображения, как изготовлена веревка
- Изображение 1 : Сделайте это 1-ым
- Изображение 2 : Сделайте это вторым
Я использую наборы форм Django вместе с моей моделью постов для достижения этой цели. Все работает абсолютно нормально в представлении создания. Нет проблем. Но в обновленном представлении вещи ломаются.
Проблема
Проблема в том, что пользователь хочет отредактировать свой пост и переключить изображение № 2. со своего поста на другое изображение. Хотя они изменили 2-е изображение. Это изображение теперь заканчивается в самом конце списка. Заставить пользователя заново загрузить все изображения. Вернуть Орден. Из-за этого мое приложение выглядит глючно.
Пример: Предположим, что у пользователя есть сообщение ниже
main post Title
" Some description "
Main Image = Post_image.jpg
1st Image = A.jpg
Image Title
Image description
2nd Image = B.jpg
Image Title
Image description
3rd Image = C.jpg
Image Title
Image description
4st Image = D.jpg
Image Title
Image description
5th Image = E.jpg
Image Title
Image description
6th Image = F.img
Image Title
Image description
Теперь, если я изменил 2-е изображение, B.jpg
на b.jpg
b.jpg переместится в самый конец списка, и у вас будет порядок A, C, D, E, F, b
Ниже представлены мои модели:
class Post(models.Model):
user = models.ForeignKey(User, related_name='posts')
created_at = models.DateTimeField(auto_now_add=True)
title = models.CharField(max_length=250, unique=True)
slug = models.SlugField(allow_unicode=True, unique=True,max_length=500)
post_image = models.ImageField()
message = models.TextField()
class Prep (models.Model): #(Images)
post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='post_prep')
image = models.ImageField(upload_to='images/', blank=True, null=True, default='')
image_title = models.CharField(max_length=100, default='')
image_description = models.CharField(max_length=250, default='')
sequence = models.SmallIntegerField() ###########################ADDED THIS
class Meta: ###########################ADDED THIS
unique_together = (('post', 'sequence'),) ###########################ADDED THIS
ordering = ['sequence'] ###########################ADDED THIS
Мой пост создать вид
def post_create(request):
ImageFormSet = modelformset_factory(Prep, fields=('image', 'image_title', 'image_description'), extra=12, max_num=12,
min_num=2)
if request.method == "POST":
form = PostForm(request.POST or None, request.FILES or None)
formset = ImageFormSet(request.POST or None, request.FILES or None)
if form.is_valid() and formset.is_valid():
instance = form.save(commit=False)
instance.user = request.user
instance.save()
post_user = request.user
for index, f in enumerate(formset.cleaned_data): #######CHANGED THIS
try: ##############CHANGED THIS
photo = Prep(sequence=index, post=instance, image=f['image'],
image_title=f['image_title'], image_description=f['image_description'])
photo.save()
except Exception as e:
break
return redirect('posts:single', username=instance.user.username, slug=instance.slug)
else:
form = PostForm()
formset = ImageFormSet(queryset=Prep.objects.none())
context = {
'form': form,
'formset': formset,
}
return render(request, 'posts/post_form.html', context)
Мой пост Редактировать Просмотр:
class PostPrepUpdate(LoginRequiredMixin, UpdateView):
model = Post
fields = ('title', 'message', 'post_image')
template_name = 'posts/post_edit.html'
success_url = reverse_lazy('home')
def get_context_data(self, **kwargs):
data = super(PostPrepUpdate, self).get_context_data(**kwargs)
if self.request.POST:
data['prep'] = PrepFormSet(self.request.POST, self.request.FILES, instance=self.object)
else:
data['prep'] = PrepFormSet(instance=self.object)
return data
def form_valid(self, form):
context = self.get_context_data()
prep = context['prep']
with transaction.atomic():
self.object = form.save()
if prep.is_valid():
prep.instance = self.object
prep.save()
return super(PostPrepUpdate, self).form_valid(form)
My Forms.py
class PostEditForm(forms.ModelForm):
class Meta:
model = Post
fields = ('title', 'message', 'post_image', 'group', )
class PrepForm(forms.ModelForm): #####################CHANGED THIS
class Meta:
model = Prep
fields = ('image', 'image_title', 'image_description', 'sequence')
PrepFormSet = inlineformset_factory(Post, Prep, form=PrepForm, extra=5, max_num=7, min_num=2)
*** Нужна помощь в устранении этой проблемы. Пример, если они меняют изображение 2. Затем оно должно оставаться в позиции номер 2 и не перемещаться в конец списка