Как сделать опцию в меню выбора пункта к Django URL - PullRequest
0 голосов
/ 12 марта 2019

У меня есть это представление как context_processors.py, что означает, что я могу представить архив как раскрывающееся меню в выбранном HTML-теге.

def blogposts_processor(request):
    blogposts = BlogPost.objects.all()
    q=blogposts.dates('date', 'month')
    s = [(i.strftime('%b'),i.strftime('%Y')) for i in q]

    return {'blogposts': blogposts,'s':s}

Я уже представил такие даты, как февраль 2018 года, апрель 2018 года и т. Д .:

 <script>   
    var n =[{% for i in q %}"{{ i|safe }}"{% if not forloop.last %},{% endif %}{% endfor %}];

    var k=[];

    var months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];

    var dynamicSelect = document.getElementById("selectdate");

    n.forEach(function(entry){
        a = new Date(entry);

        amonth=  months[a.getMonth()];
        ayear = a.getFullYear();
        c = amonth + " " + ayear;
        k.push(c);


        var newOption = document.createElement("option");
        newOption.text = c;
        dynamicSelect.add(newOption);
</script>

Теперь мой URL для архива

 url(r'^(?P<year>[0-9]{4})/(?P<month>[-\w]+)/$',
    BlogPostMonthArchiveView.as_view(),
    name="blogpost_month_archive"),

Я хочу, чтобы каждая опция в выпадающем меню выбора ссылалась на правильный архив. Поэтому каждая опция в меню должна иметь URL

 {% url 'home:blogpost_month_archive' year='ayear' month='amonth' %}

Я начал и искал решение здесь

   var url = "{% url 'home:blogpost_month_archive' year='2018' month='Feb' %}"
   var year = $(this).attr('ayear');
   var month = $(this).attr('amonth');
   document.location.href = url.replace('2018', year).replace('Feb', month);

Я не слишком далеко, я просто не знаю, как прикрепить бит document.location.href к элементу options.

Я ищу только решение JavaScript, пожалуйста. Спасибо.

1 Ответ

0 голосов
/ 14 марта 2019

Я только что использовал

var year = $(this).val().slice(4,8);
var month = $(this).val().slice(0,3);

Итак, окончательный код выглядит так:

<script>    
    var n =[{% for i in q %}"{{ i|safe }}"{% if not forloop.last %},{% endif %}{% endfor %}];

    var k=[];

    var months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];

    var dynamicSelect = document.getElementById("selectdate");

    n.forEach(function myFunc(entry){
        a = new Date(entry);

        var amonth = months[a.getMonth()];
        var ayear = a.getFullYear();

        c = amonth + " " + ayear;
        k.push(c);

        var newOption = document.createElement("option");
        newOption.text = c;
        dynamicSelect.add(newOption);


        document.getElementById("selectdate").onclick=function(){

            var url  = "{% url 'home:blogpost_month_archive' year=2018 month='Feb' %}";
            var year = $(this).val().slice(4,8);
            var month = $(this).val().slice(0,3);
            document.location.href = url.replace('2018', year).replace('Feb', month);

        }

        });



</script>

Я пытался извлечь переменные, amonth и ayear из myFunc, а затем использовать в onclickфункционировать, но мне не удалось заставить его работать.Так что это следующее лучшее рабочее решение, которое у меня было.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...