Exemplo n.º 1
0
def comment(request):
    a = 1
    book_id = request.POST.get('book_id')
    user_id = request.POST.get('user_id')
    content = request.POST.get('content')

    book = Books.objects.get(id=book_id)
    user = Passport.objects.get(id=user_id)

    try:
        # 保存评论到数据库
        comment = Comments(book=book, user=user, content=content)
        comment.save()
        #记录当前时间
        time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    except Exception as e:
        return JsonResponse({
            'code': 0,
            'msg': '评论失败,原因:' + str(e),
        })
    # 评论成功
    return JsonResponse({
        'code': 1,
        'msg': '评论成功!',
        'time': time,
    })
Exemplo n.º 2
0
def comment(request, books_id):
    if request.method == "GET":
        comments = Comments.objects.filter(book_id=books_id)
        data = []
        for c in comments:
            data.append({
                'user_id': c.user_id,
                'content': c.content,
            })
        res = {
            'code': 200,
            'data': data,
        }
        return JsonResponse(res)

    else:
        params = json.loads(request.body.decode('utf-8'))
        books_id = params.get('book_id')
        user_id = params.get('user_id')
        content = params.get('content')
        print(content)
        book = Books.objects.get(id=books_id)
        user = Passport.object.get(id=user_id)

        new_comment = Comments(book=book, user=user, content=content)
        new_comment.save()

        return JsonResponse({
            'code': 200,
            'msg': '评论成功',
        })
Exemplo n.º 3
0
def comments_add(request):

    if request.method == 'POST' :

        CommentBody = request.POST.get('CommentBody')
        CommentName = request.POST.get('CommentName')
        CommentEmail = request.POST.get('CommentEmail')
        news_pk = request.POST.get('news_pk')


        # Date for Comments
        now = datetime.datetime.now()
        year = now.year
        month = now.month
        day = now.day
        weekday = now.strftime("%A")

        month_list = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']

        for i in range(11) :
            if month == i+1 :
                month = month_list[i]
                break
        
        today = str(day) + " " + str(month) +  ", " + str(year)


        if CommentBody != "" and CommentEmail != "" and CommentName != "" :

            if 'container' in request.session :

                comment_session_dict = request.session.get('container')

            else :

                doodles = Comments_Doodle.objects.all()
                random_doodle = random.choice(doodles)
                random_doodle_picurl = random_doodle.comments_picurl

                session_dict = {
                    "name" : CommentName,
                    "email" : CommentEmail,
                    "url" : random_doodle_picurl
                }

                request.session['container'] = session_dict

                comment_session_dict = request.session.get('container')


            obj = Comments(body=CommentBody, name=comment_session_dict['name'], email=comment_session_dict['email'], picurl=comment_session_dict['url'], date=today, news_id=news_pk)
            obj.save()

            return redirect('news_detail', pk=news_pk)
             
        else :
            
            error =  "Please Enter All The Details"
            return render(request, 'front/error.html', {'error': error})
Exemplo n.º 4
0
def comment(request, books_id):
    book_id = books_id

    if request.method == 'GET':

        c = redis_db.get('comment_%s' % book_id)
        try:
            c = c.decode('utf-8')
        except:
            pass
        print('c: ', c)
        if c:

            return JsonResponse({
                'code': 200,
                'data': json.loads(c),
            })
        else:

            comments = Comments.objects.filter(book_id=book_id)
            data = []
            for c in comments:
                data.append({
                    'user_id': c.user_id,
                    'content': c.content,
                })

            res = {
                'code': 200,
                'data': data,
            }
            try:
                redis_db.setex('comment_%s' % book_id, json.dumps(data),
                               EXPIRE_TIME)
            except Exception as e:
                print('e: ', e)
            return JsonResponse(res)

    else:

        params = json.loads(request.body.decode('utf-8'))

        book_id = params.get('book_id')
        user_id = params.get('user_id')
        content = params.get('content')

        book = Books.object.get(id=book_id)
        user = Passport.objects.get(id=user_id)

        comment = Comments(book=book, user=user, content=content)
        comment.save()

        return JsonResponse({
            'code': 200,
            'msg': '评论成功',
        })
Exemplo n.º 5
0
def addcomment(request):
    print "start process"
    if request.GET:
        name=request.GET['name']
        contents=request.GET['contents']
        like=request.GET['like']
        m=Comments(name=name,contents=contents,like=like,replays=0)
        m.save()
        print "success by get"
        return HttpResponse("success")
Exemplo n.º 6
0
def mark(request):
    if request.method == 'POST':
        comment = Comments()
        commentform = CommentForm(request.POST)
        if request.user.is_authenticated():
            if commentform.is_valid():
                comment.content_object = commentform.cleaned_data[
                    'content_object']
                comment.user = request.user
                comment.comment = commentform.cleaned_data['commentcontent']
                reply_user = Comments.commentmanager.get(
                    id=int(request.POST.get('urltar')))
                parent_user = Comments.commentmanager.get(
                    id=int(request.POST.get('parent')))
                comment.reply_user = reply_user.user
                comment.parent = parent_user
                comment.save()
                data = {}
                data['user'] = request.user.username
                data['reply_user'] = reply_user.user.username
                data['comment'] = comment.comment
                data['huifuuser'] = comment.user.username
                data['parent'] = parent_user.id
                data['huifuurltar'] = comment.id
                data['urltar'] = request.POST.get('urltar')
                data['commentid'] = comment.id
                data['uploadtime'] = comment.uploadtime.strftime(
                    '%Y-%m-%d %H:%M:%S')
                data['appreciatenum'] = comment.cappreciatenum
                return JsonResponse(data)
        else:
            return JsonResponse({'status': 'error'})
    else:
        return JsonResponse({'status': 'wrong', 'errormsg': '请刷新重试'})
Exemplo n.º 7
0
def processUrl(request):

    if request.method == 'POST':
        # cleaning all data before again using it
        comment_api.comment_list.clear()
        clean_comments.dictionay.clear()
        clean_comments.sorted_most_freq.clear()
        clean_comments.sorted_lest_freq.clear()
        # getting the posted url request
        url = request.data["videourl"]
        videoid = url.replace('https://www.youtube.com/watch?v=', '')
        comment_api.youtube_search(videoid)
        comment_api.get_comment_threads(videoid)
        video_comment_threads = comment_api.comment_list
        # print(video_comment_threads)
        # adding data to django database
        # channel = Channel(
        #     channel_name=comment_api.youtube_video_list[0][3], channel_id=comment_api.youtube_video_list[0][2])
        # channel.save()
        channel = Channel.objects.get_or_create(
            channel_name=comment_api.youtube_video_list[0][3], channel_id=comment_api.youtube_video_list[0][2])
        # channel.save()
        videoItem = Videos(likes=comment_api.youtube_video_list[0][7], dislikes=comment_api.youtube_video_list[0][8],
                           channel=channel[0], title=comment_api.youtube_video_list[0][0])
        videoItem.save()
        comments = []
        for item in video_comment_threads:
            author_name = item[1]
            author = Author.objects.get_or_create(name=author_name)
            # author.save()
            text = item[0]
            comment = Comments(author=author[0], video=videoItem, comment=text)
            comment.save()
            comments.append(text)
        # for analysis
        clean_comments.slice_comments(comments)
        # least frequent--followed by----most frequent------------
        least_and_most_words = []
        # most_words = []
        for value in clean_comments.get_least_frequent():
            word = Words.Words(value[0], value[1])
            least_and_most_words.append(word)
        for value in clean_comments.get_most_frequent():
            word = Words.Words(value[0], value[1])
            least_and_most_words.append(word)
        serialData = serializers.WordsSerializer(
            least_and_most_words, many=True)

        return JsonResponse(serialData.data, safe=False)

    return Response(status=status.HTTP_400_BAD_REQUEST)
Exemplo n.º 8
0
def comment(request, books_id):
    book_id = books_id
    if request.method == "GET":
        #先在redis里面寻找评论
        c = redis_db.get("comment_%s" % books_id)
        try:
            c = c.decode("utf-8")
            print(c)
        except:
            pass

        if c:
            return JsonResponse({
                "code": 200,
                "data": json.loads(c),
            })

        else:
            #找不到,就从数据库里面取
            comments = Comments.objects.filter(book_id=book_id)
            data = []
            for c in comments:
                data.append({
                    "user_name": c.user.username,
                    "content": c.content,
                })
            res = {
                "code": 200,
                "data": data,
            }

            try:
                redis_db.setex("comment_%s" % book_id, json.dumps(data),
                               EXPIRE_TIME)
            except Exception as e:
                print("e: ", e)
            return JsonResponse(res)
    else:
        params = json.loads(request.body.decode("utf-8"))
        book_id = params.get("book_id")
        user_id = params.get("user_id")
        content = params.get("content")

        book = Books.objects.get(id=book_id)
        user = Passport.objects.get(id=user_id)

        comment = Comments(book=book, user=user, content=content)
        comment.save()

        return JsonResponse({"code": 200, "msg": "评论成功"})
Exemplo n.º 9
0
def add_comment(request):
    subject_type = request.POST['subject_type']

    new_record = Comments()
    new_record.author = request.user
    new_record.subject_id = request.POST['id']
    new_record.subject_type = subject_type
    new_record.content = request.POST['content']
    new_record.full_clean()
    new_record.save()
    if subject_type == 'Article':
        prefix = 'article'
    else:
        prefix = 'event'
    return redirect('/{}/{}'.format(prefix, request.POST['id']))
Exemplo n.º 10
0
    def post(self, request, article_id):
        comment_form = CommentsForm(request.POST)
        article = get_object_or_404(Article, pk=article_id)

        if comment_form.is_valid() and article:

            parent_id = request.POST.get("parent_id", "")
            nick_name = request.POST.get("nick_name", "")
            email = request.POST.get("email", "")
            url = request.POST.get("url", "")
            text = request.POST.get("text", "")
            comment = Comments()
            comment.nick_name = nick_name
            comment.parent_id = parent_id
            comment.email = email
            comment.url = url
            comment.text = text
            comment.article = article
            comment.save()
        return redirect(article.get_absolute_url() + "#comments")
Exemplo n.º 11
0
def add(request):
  if not request.user.is_active:
    return HttpResponse('ERR')

  if request.is_ajax() or True:
    if util.is_param_empty('news_id', request.GET):
      return Http404
    if util.is_param_empty('text', request.GET):
      return HttpResponse('ERR')

    # Save new comment
    prof.start('comment-add')
    comment = Comments(user=request.user,
                       news_id=request.GET['news_id'],
                       text=request.GET['text'])
    comment.save()
    prof.stop('comment-add')

    # Send notifications
    _notify(request)
    
    return HttpResponse('OK')
  raise Http404
Exemplo n.º 12
0
def article(request, book_id):
    """评论页面"""
    if request.method == 'GET':
        print(book_id)
        book = Books.objects.get_books_by_id(book_id)
        return render(request, 'books/article.html', {'book': book})
    elif request.method == 'POST':
        if request.session.has_key('islogin'):
            if book_id:
                content = request.POST.get('comment', '')
                title = request.POST.get('title', '')

                comment = Comments()
                comment.user_id = request.session.get('passport_id')
                comment.book_id = int(book_id)
                comment.content = content
                comment.title = title
                comment.save()

                context = {'comment': comment, 'book_id': book_id}
                return redirect(reverse('books:article', book_id, context))
        else:
            return render(request, 'books/index.html')
Exemplo n.º 13
0
def comment(request):
    if request.method == 'POST':
        comment = Comments()
        commentform = CommentForm(request.POST)
        if not request.user.is_authenticated():
            return JsonResponse({'status': 'error'})
        if commentform.is_valid():
            comment.content_object = commentform.cleaned_data['content_object']
            comment.comment = commentform.cleaned_data['commentcontent']
            comment.user = request.user
            comment.save()
            data = {}
            data['user'] = request.user.username
            data['comment'] = commentform.cleaned_data['commentcontent']
            data['uploadtime'] = comment.uploadtime.strftime(
                '%Y-%m-%d %H:%M:%S')
            data['id'] = comment.id
            data['appreciatenum'] = comment.cappreciatenum
            return JsonResponse(data)
        else:
            return JsonResponse({'status': 'error'})
Exemplo n.º 14
0
def comment_add(request):
    passport_id = request.session.get('passport_id')
    passport = Passport.objects.filter(id=passport_id)[0]
    if passport:
        content = request.POST.get('comment', '')
        books_id = request.POST.get('books_id', '')
        print('books_id================', books_id)
        book = Books.objects.get_books_by_id(books_id=books_id)
        book_li = Books.objects.get_books_type(type_id=book.type_id,
                                               limit=2,
                                               sort='default')
        bookname = book.name
        comments = Comments()
        comments.comment_man = passport
        comments.comment_book = book
        comments.comment_content = content
        comments.save()
        context = {
            'bookname': bookname,
            'content': content,
            'books': book,
            'books_li': book_li
        }
        return render(request, 'books/detail.html', context)
Exemplo n.º 15
0
def comment_post(request):
    comment_time = time.strftime('%Y-%m-%d %H:%M:%S',
                                 time.localtime(time.time()))
    try:
        filename = request.POST['filename'].encode('utf-8')
    except:
        HttpResponse('error')
    try:
        username = request.session['username']
        content = request.POST['content'].encode('utf-8')
        if len(content) < 2:
            return render(request, '404.html')
        comment = Comments()
        comment.filename = filename
        comment.name = username
        comment.content = content
        comment.isRegisted = 1
        comment.time = comment_time
        comment.save()
        file
    except:
        try:
            username = request.POST['username'].encode('utf-8')
            email = request.POST['email'].encode('utf-8')
            content = request.POST['content'].encode('utf-8')
            print len(username)
            if len(username) < 2 or len(email) < 2 or len(content) < 2:
                return render(request, '404.html')
            username += '(游客)'
            comment = Comments()
            comment.filename = filename
            comment.name = username
            comment.content = content
            comment.email = email
            comment.isRegisted = 0
            comment.time = comment_time
            comment.save()

        except:
            return render(request, '404.html')
    return HttpResponseRedirect('/detail?file=%s' % (filename))
Exemplo n.º 16
0
def comment(request, books_id):
    book_id = books_id  # books_id路径中的参数
    # 如果是get请求
    if request.method == 'GET':
        # 现在redis里面寻找评论(有过期时间所以可能查不到)
        # TODO 存储的key comment_4(书的ID),值为字符串
        c = redis_db.get('comment_%s' % book_id)
        try:
            # 将查找的评论内容解码
            c = c.decode('utf-8')
        except:
            pass
        # 如果查找到评论内容 TODO c = {'comment_4':'评论内容','comment_4':'评论内容'}
        if c:
            # 返回json数据
            return JsonResponse({
                'code': 200,
                'data': json.loads(c)  # TODO json反序列化,字符串形式转化为字典形式
            })
        else:
            # 找不到,就从数据库里面取 TODO 得到queryset集合(所有评论的集合)
            # TODO [<Comments: Comments object>, <Comments: Comments object>,
            comments = Comments.objects.filter(book_id=book_id)
            print(comments)
            # 初始化一个空列表
            data = []
            # 遍历得到的评论集合,TODO 得到每一个用户的一条评论
            for c in comments:
                # 通过评论实例对象得到用户ID与评论内容,并添加到一个空列表中
                data.append({'user_id': c.user_id, 'content': c.content})

            res = {'code': 200, 'data': data}
            try:
                # TODO json.dump-->得到json字符串
                # 将评论内容写到redis数据库中,并设置过期时间
                redis_db.setex('comment_%s' % book_id, json.dumps(data),
                               EXPIRE_TIME)
            except Exception as e:
                print('e:', e)

            return JsonResponse(res)
    # 如果请求方式不是GET
    else:
        # 从页面POST请求得到数据并解码
        # TODO {'user_id': 11, 'book_id': 4, 'content': 'params'}
        params = json.loads(request.body.decode('utf-8'))

        # 分别取出用户id,书籍ID,评论内容
        book_id = params.get('book_id')
        user_id = params.get('user_id')
        content = params.get('content')

        # 通过用户ID和书籍ID得到书籍与用户对象
        book = Book.objects.get(id=book_id)
        user = PassPort.objects.get(id=user_id)

        # 往数据库里插入一条评论信息的数据,并保存
        comment = Comments(book=book, user=user, content=content)
        comment.save()

        # 返回的内容
        return JsonResponse({
            'code': 200,
            'msg': '评论成功',
        })
 def handle(self, *args, **kwargs):
     catalog_main = Catalog(name="/", title="Главная")
     catalog_main.save()
     catalog1 = Catalog(name="cat1", title="каталог 1", parent=catalog_main)
     catalog1.save()
     blog1 = Blog(
         name="blog1",
         title="Опыт Ву",
         text="""<h3>Опыт Ву</h3>
         <p>
         Опыт Ву — эксперимент в области физики элементарных частиц и ядерной физики, проведённый в 1956 году китайским и американским физиком Цзяньсюн Ву в сотрудничестве с Лабораторией низких температур Национального бюро стандартов США[1][2]. Целью опыта было установить, сохраняется ли чётность (P-чётность[3]), которая ранее была установлена в электромагнитных и сильных взаимодействиях, также для слабого взаимодействия или нет. Если P-чётность была бы истинной сохраняющейся величиной, то зеркальная версия мира (где левое заменяется на правое, а правое — на левое) вела бы себя как зеркальное отображение настоящего мира. Если P-чётность была бы нарушена, то можно было бы различать зеркальную версию мира и зеркальное отображение настоящего мира. Опыт состоял в наблюдении распределения направлений вылета электронов из ядер кобальта-60 при бета-распаде в условиях очень низкой температуры и сильного магнитного поля. В нём обнаружилась асимметрия распределения бета-частиц, вылетающих из источника радиации.
         Результаты опыта показали, что сохранение пространственной чётности нарушается из-за слабого взаимодействия, что приводит к возможности оперативно определять левое и правое[en] без привязки к макрообъектам реального мира. Этот результат не был ожидаемым в физическом сообществе, которое раньше считало чётность сохраняющейся величиной[en]. Чжэндао Ли и Чжэньнин Янг, физики-теоретики, которые положили начало идее несохранения чётности и предложили этот эксперимент, получили за свою теоретическую работу Нобелевскую премию по физике 1957 года. Роль Ву Цзяньсюн в открытии была упомянута в нобелевской речи[4], но не была отмечена вплоть до 1978 года, когда ей впервые присудили премию Вольфа.
         </p>
         <h3>История</h3>
         <p>
         В 1927 году Юджин Вигнер формализовал принцип сохранения чётности (P-чётности)[5] — идею о том, что настоящий мир и мир, построенный как его зеркальное отображение, будут вести себя одинаково, с той лишь разницей, что левое и правое будут перевёрнуты (например, часы, которые идут по часовой стрелке, будут вращаться против часовой стрелки, в зеркальном мире).
         Этот принцип был широко принят физиками, а сохранение P-чётности экспериментально подтвердили в электромагнитных и сильных взаимодействиях. Однако в середине 1950-х годах некоторые распады с участием каонов не могли быть объяснены существующими теориями, в которых предполагалось, что P-чётность сохраняется. Казалось, что существует два типа каонов: один распадается на два пиона, а другой — на три пиона. Этот эффект получил название τ — θ-парадокс[6][7].
         Чжэндао Ли и Чжэньнин Янг положили начало идее несохранения чётности. Они провели обзор литературы по вопросу сохранения чётности во всех фундаментальных взаимодействиях и пришли к выводу, что в случае слабого взаимодействия экспериментальные данные не подтверждают и не опровергают наличия P-симметрии[8][9]. Вскоре после этого они обратились к Цзяньсюн Ву, эксперту по спектроскопии бета-распада, с различными идеями для экспериментов. Они остановились на идее проверить направленность бета-распада в кобальте-60. Ву осознала потенциал революционного эксперимента и, желая опередить остальное физическое сообщество, приступила к работе в конце мая 1956 года, отменив запланированную поездку в Женеву и на Дальний Восток со своим мужем. Большинство физиков, включая её близкого друга Вольфганга Паули, считали это невозможным[10]. Другой известный учёный, Ричард Фейнман, заключил пари 10 000 к 1 с физиком Норманом Рамзеем на провал эксперимента; узнав о его результатах, он договорился на пятьдесят долларов — сумму, которую он позже заплатит Рамзею на Рочестерской конференции[11][12].
         Ву пришлось связаться с Генри Бурсом и Марком Земанским[en], которые имели большой опыт в физике низких температур, чтобы провести свой эксперимент. По просьбе Бурса и Земанского Ву связалась с Эрнестом Амблером[en] из Национального бюро стандартов для помощи в организации эксперимента, который должен был состояться в 1956 году в Лаборатории низких температур Национального бюро стандартов[6]. В декабре 1956 года после нескольких месяцев работы и преодоления технических трудностей команда Ву установила асимметрию, указывающую на нарушение чётности[13].
         Ли и Янг, которые инициировали опыт Ву, за свою теоретическую работу были награждены Нобелевской премией по физике в 1957 году, вскоре после проведения эксперимента. Роль Ву в открытии была упомянута в речи во время вручения премии[4]. Вольфганг Паули, Янг, Ли и многие другие учёные были возмущены таким решением Нобелевского комитета, а лауреат Нобелевской премии 1988 года Джек Штайнбергер назвал это самой большой ошибкой в истории Нобелевского комитета[14]. В 1978 году Ву была присуждена первая премия Вольфа[15].
         </p>""",
         catalog=catalog1,
     )
     blog1.save()
     blog2 = Blog(
         name="blog2",
         title="Павел Филиппович Горпищенко",
         text="""
         <h3>Павел Филиппович Горпищенко</h3>
         <p>Павел Филиппович Горпищенко (13 декабря 1893 — 28 ноября 1943) — советский военный деятель, полковник, участник Первой мировой, Гражданской и Великой Отечественной войн. В межвоенные годы — командир ряда батарей береговой обороны Черноморского флота. В годы Великой Отечественной войны — командир 1-го Севастопольского полка морской пехоты, 8-й бригады морской пехоты и 77-й Симферопольской Краснознамённой стрелковой дивизии.</p>
         <h3>Первая мировая и гражданская война</h3>
         <p>
         Родился 13 декабря 1893 года в станице Пашковской Кубанской области (нынешний Краснодарский край). Мобилизован на военную службу в Первую мировую войну в 1914 году, службу проходил как рядовой Карской крепостной артиллерии на Кавказском фронте. С 1917 года служил в Эрзерумском артиллерийском полку[1].
         С 1918 года участвовал в Гражданской войне на стороне красноармейцев как доброволец. Член ВКП(б) с 1919 года[1]. Командир отделения позиционной батареи в Новороссийске (май 1920 года), с июля 1920 года командовал 2-й полевой тяжёлой батареей 9-й армии, в феврале 1921 года назначен на аналогичную должность в 1-й полевой тяжёлой батареи. С августа 1921 года — исполняющий должность инструктора для поручений при артиллерийском отделе Кавказского сектора, с октября 1921 года — командир 3-й и 1-й батарей[1].
         </p>
         <h3>Межвоенные годы</h3>
         <p>
         Продолжил службу в береговой артиллерии после войны. С октября 1923 года — командир батареи берегового дивизиона Новороссийской группы. С февраля 1924 года — командир батареи 2-го дивизиона Севастопольской крепости. С ноября 1926 года — командир батареи Батумского укрепрайона. C февраля 1928 года занимал должность помощника командира дивизиона 6‑й крепостной артиллерийской бригады. В июле 1930 года назначен помощником начальника сектора Технического управления Управления ВМС СССР. С февраля 1932 года — командир башни № 7 1‑й бригады береговой обороны Морских сил Балтийского моря. С мая 1932 года командовал железнодорожной батареей Ижорского укрепрайона. В октябре 1934 года переведен в 4‑е училище береговой обороны (Севастопольское военно-морское училище имени ЛКСМУ), где преподавал и занимал должность командира 4‑го дивизиона. С февраля 1938 года — начальник школы оружия учебного отряда Черноморского флота[1].
         </p>
         """,
         catalog=catalog1,
     )
     blog2.save()
     blog3 = Blog(
         name="blog3",
         title="Чудесный улов (картина Вица)",
         text="""
         <h3>Чудесный улов</h3>
         <p>
         «Чудесный улов»[1][2][3], или «Чудесный улов рыбы»[4][5][6] (нем. Der wunderbare Fischzug; фр. La Pêche miraculeuse[7])[К 1], — картина немецко-швейцарского живописца Конрада Вица, созданная в 1444 году для алтаря собора Святого Петра в Женеве и являвшаяся изначально частью триптиха. Серьёзно пострадав в ходе иконоборческих волнений периода Реформации, впоследствии неоднократно реставрировалась. В конце XIX — начале XX века, после того как женевский алтарь был достоверно атрибутирован Конраду Вицу, картина приобрела особое значение для национального искусства Швейцарии. С 1910 года она находится в собрании Женевского музея искусства и истории.
         Принято считать, что в «Чудесном улове» отражены два новозаветных эпизода: явление Христа ученикам на Тивериадском озере (описанное в Евангелиях от Иоанна и от Луки) и хождение по водам, упоминаемое у Матфея. Примечательно то, что фоном для них служит легко узнаваемый пейзаж конкретной местности: Женевского озера, Савойи, Предальп. Исследователи предполагают, что столь необычный для живописи XV века приём во многом продиктован внешними, историко-политическими причинами и что на создание картины повлияли такие события, как Базельский собор и избрание савойского герцога Амадея VIII антипапой Феликсом V. Несмотря на то, что «первым реалистичным пейзажем в европейской живописи» (как его часто называют) «Чудесный улов» можно считать лишь с оговорками, он интересен как сложное, многоплановое и во многом новаторское произведение.
         </p>
         <h3>Создание</h3>
         <p>
         Конрад Виц, один из основоположников искусства Северного Возрождения, родился между 1400 и 1410 годами. Местом его рождения принято считать Ротвайль (ныне земля Баден-Вюртемберг, Германия)[4][11][12], однако современные исследователи подчёркивают отсутствие достоверных тому подтверждений и предполагают, что родным городом Вица мог также быть Констанц[13]. О происхождении, образовании и последующей жизни художника известно немного. С 1431 года он жил в Базеле, став в 1434 году членом базельской гильдии живописцев; впоследствии работал также в Констанце и Женеве[4][14][15]. Виц, в чьём творчестве заметно влияние нидерландских живописцев, — один из наиболее радикальных новаторов в искусстве Северной Европы, в полной мере воплотивший тенденции своего времени и приблизивший немецкую живопись к идеалам Возрождения[11][2][1][16]. Он много экспериментировал с перспективой и светотенью, достигая почти иллюзорной объёмности и осязаемости фигур, передавая глубину пространства и игру света на различных текстурах; его творчеству свойственны одновременно пристальное внимание к деталям и стремление создать целостную картину мироздания[4][14][1][10][17].
         Между 1440 и 1443 годом кардинал Франсуа де Мец[de], епископ Женевы, заказал Конраду Вицу алтарь для женевского Собора Святого Петра[18][19]. Скорее всего, Франсуа де Мец, живший в то время в Базеле, видел перед тем другое творение Вица — алтарь «Зерцало искупления[fr]» в базельской церкви Святого Леонарда[de]. Вероятно, мастерство художника произвело на него благоприятное впечатление, после чего он и пригласил Вица в Женеву[19].
         Подпись Конрада Вица на нижней раме «Чудесного улова»
         Изначально женевская композиция представляла собой триптих, от которого до наших дней дошли две двусторонние створки. На лицевой (внутренней) стороне правой створки находится «Освобождение Святого Петра из темницы», на оборотной (внешней) — «Франсуа де Мец, поклоняющийся Пресвятой Деве и Младенцу Христу»; на левой створке с лицевой стороны «Поклонение волхвов», с оборотной — «Чудесный улов»[18][19][20]. Утраченная центральная часть представляла собой, вероятно, скульптурную композицию; возможно, с деревянными полихромными скульптурами[20][21][19]. Дата завершения работы — 1444 год — следует из надписи, сделанной художником на нижней раме «Чудесного улова»: «Hoc opus pinxit magister conradus sapientis de basilea MCCCCXLIIII» («Сию картину написал мастер Конрадус Сапиентис из Базеля в 1444»)[22][23][К 2].
         Первоначальное расположение створок известно благодаря сохранившимся на деревянных рамах меткам для крепления петель[22]. Что касается местонахождения самого алтаря, возможны два варианта. Собор в то время был посвящён веригам апостола Петра; с этой темой соотносится одно из алтарных панно («Освобождение Святого Петра»), поэтому вероятно, что созданный Конрадом Вицем триптих предназначался для одного из главных алтарей храма[25]. Вместе с тем присутствие на другом панно Франсуа де Меца, умершего 7 марта 1444 года, позволяло предположить, что соответствующий алтарный образ был создан в его память — тогда алтарь должен был находиться в капелле Маккавеев, где и был похоронен кардинал[23][26][27]. В 1907 году один из исследователей, Конрад Мандах[de], заметил, что ширина алтаря (6,2 м) превышает ширину капеллы (6,05 м). Вероятно, это следует считать решающим аргументом в пользу того, что он находился в хоре собора; именно этой версии придерживаются в настоящее время большинство исследователей[28][29].
         </p>
         """,
         catalog=catalog1,
     )
     blog3.save()
     blog4 = Blog(
         name="blog4",
         title="Диккер, Жоэль",
         text="""
         <h3>Диккер, Жоэль</h3>
         <p>
         Жоэль Диккер (фр. Joël Dicker, род. 16 июня 1985, Женева, Швейцария) — современный швейцарский писатель, пишет на французском языке. Диккер получил широкую известность детективным романом «Правда о деле Гарри Квеберта», вышедшим в 2012 году. Роман был переведён более чем на 40 языков и издан более чем в 60 странах уже к 2017 году. За этот роман писатель получил целый ряд престижных международных литературных премий, включая Гран-при Французской академии и Гонкуровскую премию лицеистов. Книга была экранизирована для телевидения известным французским режиссёром Жан-Жаком АнноПерейти к разделу «#«Правда о деле Гарри Квеберта»».
         Творчество и личность писателя привлекают внимание средств массовой информации и известных литературоведов. Пресса сообщает о его увлечении боксом, смешанными боевыми искусствами, кроссфитом, латиноамериканской музыкой, многочисленных путешествиях и семьеПерейти к разделу «#Личность и личная жизнь». Литературоведы наряду с анализом литературных достоинств романов Жоэля Диккера пишут об умело организованных рекламных кампаниях и тесном сотрудничестве писателя с французской фирмой Éditions de Fallois (фр.)русск., на протяжении восьми лет издававшей и продвигавшей на международном книжном рынке произведения ДиккераПерейти к разделу «#Особенности творчества».
         В 2020 году писатель издал новый детективный роман «Загадка комнаты 622» (фр.)русск. — первую книгу, в которой действие происходит не в американской провинции, как в предыдущих романах Диккера, а на его родине — в Швейцарии. Журнал Forbes назвал «Загадку комнаты 622» самым ожидаемым романом весны — лета 2021 года в РоссииПерейти к разделу «#Загадка комнаты 622».
         </p>
         <h3>Ранние годы</h3>
         <p>
         О своей учёбе писатель вспоминал: «Я был плохим учеником, не отличался прилежанием, не сдавал домашние задания. К концу учебного года мой стол был в ужасном беспорядке, он был переполнен невыполненными упражнениями. Я боялся, что учитель обыщет мой стол». В одном из интервью Диккер упоминал, что был исключён из университета: «Меня исключили из университета, так как я не сдал экзамен. Я не знал, что буду делать со своей жизнью, я потерялся. Написал письмо декану с просьбой о восстановлении»[9]. После окончания университета некоторое время Диккер работал парламентским атташе Учредительного собрания Женевы (фр.)русск.[10].
         В 2005 году Диккер опубликовал первую новеллу «Тигр», получившую Международную премию молодых авторов. Она была опубликована в сборнике победителей конкурса издательством L’Hèbe[7][11]. В интервью Диккер признавался, что в 2009 году написал пять романов, в которых рассказывал о проблемах молодого человека. Издательства отказались печатать эти книги. По словам писателя, это заставило его понять, что желание заниматься сочинительством у него «возникло не из-за потребности в катарсисе, а из-за любви к чтению определённого типа книг»[9].
         В январе 2012 года был издан роман Диккера «Последние дни наших отцов», рассказывающий о деятельности Управления специальных операций во время Второй мировой войны, известном как «секретная армия Черчилля»[12]. Управление специальных операций Великобритании — отделение Британской секретной разведывательной службы, которое обучало французские ячейки движения Сопротивления во время Второй мировой войны. Диккер закончил рукопись в 2009 году, но тогда ни один редактор не захотел печатать книгу[13].
         В 2010 году писатель представил роман на конкурс за Премию женевских писателей. Приз присуждается писателям каждые четыре года за неопубликованные рукописи. К большому удивлению Диккера, он одержал победу на конкурсе. Вскоре после этого с ним связался редактор швейцарского издательства L’Age d’Homme (фр.)русск. Владимир Димитриевич, который предложил отредактировать книгу для издания. Первоначально планировалось, что книга выйдет в Швейцарии в апреле 2010 года. Но в издательстве решили, что тема романа заинтересует и французскую читательскую аудиторию, поэтому предложили отложить выпуск романа до сентября 2010 года и работать над ним вместе с парижским издателем Бернаром де Фаллуа (фр.)русск.. Владимир Димитриевич не увидел опубликованную книгу, так как в июне 2011 года погиб в автокатастрофе по пути в Париж. После его смерти работа над изданием затянулась. Книга вышла только в 2012 году в издательстве Éditions de Fallois (фр.)русск.[13]. Она не привлекла большого внимания читателей, было продано не более нескольких сотен экземпляров романа[12].
         </p>
         """,
         catalog=catalog1,
     )
     blog4.save()
     blog5 = Blog(
         name="blog5",
         title="Обезьяний хлеб",
         text="""
         <h3>Обезьяний хлеб</h3>
         <p>
         Обезьяний хлеб (англ. Monkey Bread) — американская сладкая выпечка, пирог, состоящий из кусочков дрожжевого теста, посыпанных корицей[1]. Хлеб часто подают на завтрак, как угощение на торжествах, а также на ярмарках и фестивалях[2].
         Термин «обезьяний хлеб» возник из-за того, что выпечку едят руками; человек разбирает хлеб по кусочкам, как обезьяна[3].
         По другой версии, шарики хлеба напоминают плоды баобаба, которые так любят обезьяны. Африканцы поэтому называют баобаб «обезьяний хлеб»[4][5].
         Другие названия хлеба: Раздельный хлеб, Пузырьковый хлеб, Наслаждение рождественским утром[3], Обезьяний хлебный паззл, Обезьяньи мозги, Липкий хлеб, Венгерский кофейный торт, Золотой дамплинг-кофейный торт, Ущипни-меня-торт, Разорви-торт, Пузырь-буханка, Весёлый хлеб, Африканский хлеб.
         </p>
         <h3>Происхождение</h3>
         <p>
         Известный в Соединённых Штатах обезьяний хлеб, на самом деле, это венгерский десерт Арани галуска (венг. Aranygaluska, «золотые клецки/галушки»), состоящий из шариков дрожжевого теста, которые обваливают в топлёном масле, а затем в смеси сахара и измельчённых орехов. Он был отмечен ещё в 1880-х годах в венгерских книгах, и венгерские иммигранты привезли это блюдо в Америку. В середине ХХ века венгерские и еврейские пекарни стали его продавать[6].
         Рецепты хлеба впервые появились в американских женских журналах и поваренных книгах в 1950-х годах. В 1972 году в кулинарную книгу, опубликованную Бетти Крокер, был включён рецепт арани галуска, который был озаглавлен «Венгерский кофейный пирог». По мере того, как арани галуска становились всё более популярными в Америке, их стали путать с обезьяньим хлебом. «Обезьяний хлеб» вскоре стал более распространённым названием этого венгерско-еврейского десерта[7]. В 1980-е годы Нэнси Рейган популяризировала подачу обезьяньего хлеба на Рождество, сделав его одним из основных рождественских блюд в Белом доме во времена президентства Рональда Рейгана[8]. По словам историка кулинарии Джила Маркса, Нэнси подавала своему мужу обезьяний хлеб накануне свидетельских показаний в Конгрессе по делу Иран — контрас, при этом бывший президент Рональд Рейган якобы заметил: «Мамочка, я могу попасть в тюрьму, но я всегда буду помнить этот обезьяний хлеб»[9][10][11].
         </p>
         <h3>Приготовление</h3>
         <p>
         Хлеб изготавливается из кусочков сладкого дрожжевого теста (часто замороженного), которые по отдельности обваливаются в растопленном сливочном масле, корице с сахаром, орехах, а затем выкладываются в форму для выпечки и выпекаются[12]. Иногда хлеб поливают сиропом, карамелью или глазурью (Арани галуска подают с ванильным кремом). Обезьяний хлеб традиционно подают горячим, запечённые дольки можно легко отрывать руками[13].
         </p>
         """,
         catalog=catalog1,
     )
     blog5.save()
     blog6 = Blog(
         name="blog6",
         title="Никола Отвратный",
         text="""
         <h3>Никола Отвратный</h3>
         <p>
         «Нико́ла Отвра́тный» — иконографический извод изображения святого Николая Чудотворца, широко распространённый в XVIII веке среди старообрядцев Ветки в Полесье (Южная Белоруссия)[1][2][3][Прим 1] и Стародубья на территории бывшей Черниговской губернии[3][Прим 2]. Происхождение данного иконографического образа на настоящее время окончательно не установлено[5]. Известно, однако, что в народной культуре иконе «Никола Отвратный» молились о предотвращении бед (местное выражение гласит до сих пор: «От беды Николин образ просят»)[6].
         «Никола Отвратный» — обычно оплечное изображение святителя с отчётливо заметным направлением взгляда в сторону[7][8]. Никола Отвратный поворачивает голову вправо от зрителя, но взгляд его крупных глаз направлен, напротив, влево[6][9]. Нижняя линия изображения часто обрезает до половины Евангелие, которое Никола держит в левой руке, и благословляющую правую руку[10]. Голова святого обычно увеличена и приближена к краю доски. Часто на иконах такого типа пальцы благословляющей руки святого изображаются в жесте, который можно рассматривать как напоминание или предупреждение[11].
         В настоящее время иконы Николы Отвратного находятся в коллекциях Государственной Третьяковской галереи, Музея древнерусской культуры и искусства имени Андрея Рублёва, Брянского областного музейно-выставочного центра, Ветковского музея старообрядчества и белорусских традиций имени Ф. Г. Шклярова, в Музее русской иконы в Печчоли (Италия, Тоскана), а также в старообрядческих храмах и семейных собраниях Российской Федерации и зарубежья[12].
         </p>
         <h3>Особенности иконографического типа</h3>
         <p>
         «Никола Отвратный» — редкий и малоизученный иконографический извод[11][3]. Извод появился не ранее XVIII века[13]. Широкое распространение он получил в старообрядческих[Прим 3] духовных и художественных центрах Стародубья и Ветки[Прим 4], которые находились в Черниговской и Могилёвской губерниях Российской империи, где был включён в местную иконописную традицию[3]. В этих старообрядческих общинах данный образ был окружён особым почитанием. Иконографический извод Николы Отвратного существовал в иконописи Ветки до середины XX века, а в Стародубье даже до 1970-х годов[16].
         Общий образ Николая Чудотворца для значительного числа изводов иконографии — «Сед брада невелика курчивата. Взлис плешив. На плеши мало кудерцов. Риза багор пробелён лазорем. Испод на бело лазорь: в руке Евангелие рукою благословляет»[6]. Особенностью иконографии Николы в Ветке является изображение Богородицы и Христа на облаках по разные стороны от святого. Изображение облаков на иконе является достаточно условным. Эта условность подчёркнута столь же условным изображением льющегося на них света с помощью листового золота. Другой местной особенностью является изображение нимба в виде золотых лучей, исходящих от голов персонажей. Эту особенность доктор исторических наук Сергей Таранец и искусствовед Галина Нечаева воспринимали как следствие западного влияния на творчество иконописцев этого региона. Евангелие Никола часто держит на плате, украшенном мелкими золотыми цветочками[17].
         «Никола Отвратный» — чаще всего оплечное изображение святителя с направленностью взгляда в сторону[7][8]. При этом, хотя Никола Отвратный поворачивает голову вправо от зрителя, взгляд его крупных глаз направлен, напротив, влево[13][6][9]. Нижняя линия изображения часто обрезает до половины Евангелие и благословляющую руку[10]. Пристальный взгляд Николы Отвратного внушал страх маленьким детям. Жительница одного из старообрядческих сёл рассказывала о своём детстве (с сохранением орфографии оригинала): «Николиной иконе порой поручали смотреть» за детьми, «мать уходит, скажет: „Вот, глядите же, уроки учите — Никола всё видит!“ — Мы и под стол влезем, выглянем, и из-под кровати, — а он всё смотрит!»[18]
         Голова святого обычно увеличена[19][11] и приближена к краю доски. Часто на иконах такого типа пальцы благословляющей руки святого изображаются в жесте, который искусствоведы рассматривают как напоминание или предупреждение. Все известные иконы этого извода имеют примерно одинаковый размер[11]. На некоторых встречаются поясняющие надписи[13][9][11].
         </p>
         <h3>Никола Отвратный на житийной иконе</h3>
         <p>
         «Никола Отвратный» часто окружался клеймами жития[20]. В соответствии с «Житием Николая Чудотворца», святой прославился тем, что «побеждал бесов». Этот сюжет — один из любимых иконописцами на многоклеймовых ветковских иконах «Никола в житии»[6].
         В свою очередь, сам образ «Николы Отвратного» мог быть клеймом многочастной иконы[21][22]. Примером может служит шитый оклад к четырёхчастной иконе добрянской работы XIX века из собрания Валентина Шуба. Четыре части оклада — «Знамение», «Взыскание погибших душ», «Умягчение злых сердец» и «Никола Отвратный». Между ними помещён «Спас Благое молчание»[23]. Галина Нечаева попыталась определить, какое именно место образ «Николы Отвратного» занимает в качестве клейма на многочастной иконе. Она пришла к выводу, что это всегда нижнее, а чаще всего — нижнее правое клеймо, в измерении же иконы — это нижнее левое место. Композиция житийной иконы имеет архаическую связь с символическим строением мира-космоса. В фольклорной ситуации ветковской иконописи, по мнению Нечаевой, левая сторона низа — наиболее «хтоническая» зона модели мира. Оттуда могут вырваться «стихийные силы — разрушающие, но и плодородные, если придать им культурное направление»[Прим 5]. Изображение в этой позиции Николы Отвратного, с точки зрения Нечаевой, усиливает власть «хозяина» над хтоническим наследием языческого мира, так как образ Николы впитал в себя черты древнего хозяина низа — бога Велеса. Косой взгляд Николы архаичен — он грозно «разговаривает» с «неведомой» и «нечистой» силами на их собственном языке[22].
         Иконографический тип «Никола Отвратный» мог также сочетаться на одной и той же многочастной иконе с другими иконографическими изводами изображения Николая Чудотворца, например, с «Николой Можайским»[2][21].
         </p>
         """,
         catalog=catalog1,
     )
     blog6.save()
     comment1 = Comments(
         text="просто комментарий",
         owner=blog1,
     )
     comment1.save()
     comment2 = Comments(
         text="ответ на комментарий",
         parent=comment1,
     )
     comment2.save()