def view_b(request): if request.method == 'POST': create_thread_form = Post_Form() upload_file_form = UploadFileForm(request.FILES) #Парсим из текста сообщения номера постов, на которые в нём есть ответ. temp = pars_for_answer(request.POST.get('text_input')) thread = Thread.objects.create(thread_message = pars_for_anchor(request.POST.get('text_input')), thread_pict = request.FILES.get('files'), thread_time = datetime.now(), thread_email = request.POST.get('email_input'), thread_theme = request.POST.get('theme_input'), ) else: create_thread_form = Post_Form() upload_file_form = UploadFileForm() return render(request,'imageboard_app/b.html', {'create_thread_form':create_thread_form, 'threads':Thread.objects.all(), 'upload_file_form':upload_file_form, })
def view_thread(request): if request.method == 'POST': form = Post_Form() file_form = UploadFileForm(request.FILES) #Парсим из текста сообщения номера постов, на которые в нём есть ответ. temp = pars_for_answer(request.POST.get('text_input')) post = Anon_Post.objects.create(post_text = pars_for_anchor(request.POST.get('text_input')), post_pict = request.FILES.get('files'), post_time = datetime.now(), post_email = request.POST.get('email_input') ) #Каждому посту из текста добавляем атрибут с номером поста, который на него ответил. for element in temp: temp_post = Anon_Post.objects.get(id = int(element)) temp_post.post_answer = temp_post.post_answer + " " + ("<a href=\"#%s\">>>%s</a>" % (post.id, post.id)) temp_post.save() else: form = Post_Form() file_form = UploadFileForm() return render(request,'imageboard_app/thread.html', {'form':form, 'posts':Anon_Post.objects.all(), 'file_form':file_form, })
def view_thread(request, section_name, thread_id_section): # Получаем тред thread = Thread.objects.get( thread_section = section_name, thread_id_section = thread_id_section, ) # Получаем объекты раздела (в каком разделе мы находимся?) object_section = Section.objects.get(section_name = section_name) # Создаём классы FormsetFactory, т.к. в треде более 1 одинаковой формы. # Используя наши классы-модели. Минимальная валидация, т.к. есть необязатель # ные поля. PostFormSet = formset_factory( Post_Form, extra=1, min_num=1, validate_min=True,) FileFormSet = formset_factory( UploadFileForm, extra=1, min_num=2, validate_min=True,) if request.method == 'POST': # Создаём объекты-formset. post_formset = PostFormSet(request.POST) file_formset = FileFormSet(request.POST, request.FILES) # Узнаём, какой номер поста нужно присвоить новому посту. post_id_section = pub_thread_number( section_name, Anon_Post.objects.filter(post_section = section_name)) # Если валидна верхняя форма для постинга, то работаем с ней. # Объявляем в form_num, что надо работать c данными из верхней формы. if post_formset[0].is_valid() or file_formset[0].is_valid(): form_num = 'form-0' # Ну, если валидна нижняя, то работаем уже с ней. # И да, странная проблема, валидна она всегда. elif post_formset[1].is_valid() or file_formset[1].is_valid(): form_num = 'form-1' # Проверяем, есть ли у нас картинка или сообщение. Дополнительные проверка # идёт из-за странного поведения form-1 -она всегда валидна. if (bool(request.POST.get('%s-text_input' % (form_num))) or bool(request.FILES.get('%s-files' % (form_num)))): post = Anon_Post.objects.create( post_text = pars_for_anchor( request.POST.get('%s-text_input' % (form_num)), section_name, thread_id_section), post_pict = ( request.FILES.get('%s-files' % (form_num)) or None), post_time = datetime.now(), post_email = request.POST.get('%s-email_input' % (form_num)), post_thread = thread, post_section = section_name, post_id_section = post_id_section, ) # При условии наличия картинки мы создаём превьюшку. if post.post_pict: path = (os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + "/imageboard_app/media/%s" % (post.post_pict.name[2:]) ) create_preview(link = path, name = post.post_pict.name[2:]) post.post_pict_small = 'small_%s' % (post.post_pict.name[2:]) post.save() # Если в постe обнаружен текст вида ">>3", # то добавляем обьекту, на который ссылается пост, значение, # в специальный атрибут, со всеми ссылающимися на него постами. post_answer_f( pars_for_answer( request.POST.get('%s-text_input' % (form_num))), thread, section_name, post_id_section) # Обновляем значение thread_updated (оно используется для сортировки тредов) # при выводе их в разделе. thread.thread_updated = datetime.now() # Тут проверяем количество постов в треде, # наличие картинок в ответах. # Используется для вывода подписи "пропущено столько-то постов" под тредом. if thread.posts.all().count() > 3: thread.thread_s_answer_count += 1 if post.post_pict: thread.thread_p_answer_count += 1 thread.save() return HttpResponseRedirect( '/%s/%s/' % (section_name, thread_id_section) ) else: post_formset = PostFormSet() file_formset = FileFormSet() return render(request,'imageboard_app/thread.html', { 'form':post_formset, 'posts':Anon_Post.objects.filter(post_thread=thread.id), 'file_form':file_formset, 'thread_id_section': thread_id_section, 'thread':thread, 'section_name':thread.thread_section, 'section_visible_name':object_section.section_visible_name, })