programing

클라이언트 측 Javascript에서 Django를 'reverse' 호출

showcode 2023. 3. 26. 11:57
반응형

클라이언트 측 Javascript에서 Django를 'reverse' 호출

츠요시는 ''를 reverse()모든 곳에서 작동하며 모든 것이 최대한 건조하게 유지됩니다.

하지만 클라이언트측 javascript에 적용하는데 어려움이 있습니다.전달된 ID에 따라 일부 데이터를 로드하는 JS 클래스가 있습니다.이 데이터의 발신기지 URL을 하드코드하지 않는 표준 방법이 있습니까?

var rq = new Request.HTML({
    'update':this.element,
}).get('/template/'+template_id+'/preview'); //The part that bothers me.

또 다른 방법은 각 URL을 해결하기 위해 전체 URL 구조나 Ajax 요청을 노출할 필요가 없습니다.그다지 아름답지는 않지만, 심플하게 다른 제품보다 뛰어납니다.

var url = '{% url blog_view_post 999 %}'.replace (999, post_id);

)blog_view_post URL을 할 수 .999물론 번호를 매겨야 합니다.

이것과 막 씨름하던 중, 나는 조금 다른 해결책을 생각해 냈다.

제 경우 외부 JS 스크립트를 사용하여 버튼 클릭으로 (다른 처리를 한 후) AJAX 콜을 호출하고 싶었습니다.

HTML에서 HTML-5 커스텀 속성을 사용하여

<button ... id="test-button" data-ajax-target="{% url 'named-url' %}">

그리고 자바스크립트에서는 단순히

$.post($("#test-button").attr("data-ajax-target"), ... );

, 장고의 한다는 것을 의미합니다.reverse()논리를 가르쳐 주세요.

가장 합리적인 해결책은 JavaScript 파일의 URL 목록을 전달하고 클라이언트에서 reverse()와 동등한 JavaScript를 사용하는 것입니다.유일한 반대는 URL 구조 전체가 노출된다는 것입니다.

( 질문에서) 그런 기능이 있습니다.

JavaScript에서 Django까지 모든 파라미터가 요청대로 전달된다고 가정하는 것이 좋습니다.GET 또는 요청.대부분의 경우 JavaScript 쿼리에 적합한 형식의 URL이 필요하지 않으므로 POST를 수행할 수 있습니다.

유일한 문제는 url을 Django에서 JavaScript로 전달하는 것입니다.나는 그것을 위해 도서관을 출판했다.코드 예:

urls.py

def javascript_settings():
    return {
        'template_preview_url': reverse('template-preview'),
    }

자바스크립트

$.ajax({
  type: 'POST',
  url: configuration['my_rendering_app']['template_preview_url'],
  data: { template: 'foo.html' },
});

아나톨리의 답변과 비슷하지만 좀 더 유연합니다.페이지 맨 위에 놓기:

<script type="text/javascript">
window.myviewURL = '{% url myview foobar %}';
</script>

그러면 이렇게 하면 돼요.

url = window.myviewURL.replace('foobar','my_id');

뭐 그런 거.URL에 변수가 여러 개 포함되어 있는 경우 replace 메서드를 여러 번 실행합니다.

아나톨리의 생각은 좋지만, 특정 정수를 사용하는 것은 위험하다고 생각합니다.일반적으로 개체 ID를 지정하려고 합니다. 개체 ID는 항상 양수여야 하므로 음수 정수를 자리 표시자로 사용합니다.은 '아, 아, 아, 아, 아, 아, 아, 아, 하다'를 거예요.-?URL 을 사용합니다.

url(r'^events/(?P<event_id>-?\d+)/$', events.views.event_details),

그러면 템플릿에서 역 URL을 가져올 수 있습니다.

{% url 'events.views.event_details' event_id=-1 %}

리고 and and를 사용하세요.replace 홀더를 에서 javascript를 합니다.-1

<script type="text/javascript">
var actual_event_id = 123;
var url = "{% url 'events.views.event_details' event_id=-1 %}".replace('-1', actual_event_id);
</script>

이는 여러 인수로 쉽게 확장되며 특정 인수에 대한 매핑이 템플릿에 직접 표시됩니다.

간단한 요령을 알아냈어요URL이 다음과 같은 패턴인 경우:

"xyz/(?P<stuff>.*)$"

실제 정보를 제공하지 않고 JS에서 리버스(이를 제공하기 위해 JS 실행 시간 참조)하려는 경우 다음을 수행할 수 있습니다.

보기를 변경하여 파라미터에 기본값(없음)을 지정하고 설정되지 않은 경우 오류로 응답하여 처리합니다.

views.py

def xzy(stuff=None):
  if not stuff:
    raise Http404
  ... < rest of the view code> ...
  • 를 변경하여 URL 일일::::::::::::::: alter alter alter alter alter alter alter alter )를 선택합니다."xyz/(?P<stuff>.*)?$"
  • 템플릿 js 코드:

    .syslog URL: "{url views.xyz }}" + js_stuff, ... }"

생성된 템플릿은 JS에 매개 변수가 없는 URL이 있어야 하며 JS에서는 매개 변수 위에 간단히 연결할 수 있습니다.

다음 패키지를 사용합니다.https://github.com/ierror/django-js-reverse

JS에 django에 정의된 모든 URL이 포함된 개체가 있습니다.지금까지 발견한 방법 중 가장 좋은 방법이에요.

기본 템플릿의 선두에 생성된 js를 추가하고 URL을 추가할 때마다 생성된 js를 갱신하는 관리 명령만 실행하면 됩니다.

함께 제공된 솔루션 중 하나는 백엔드에 URL을 생성하여 브라우저에 전달하는 것입니다.

모든 경우에 적합한 것은 아니지만 테이블(AJAX로 채워져 있음)이 있으며 행을 클릭하면 사용자가 이 테이블에서 단일 엔트리로 이동합니다.

(저는 django-restrameworkDatatables를 사용하고 있습니다).

AJAX로부터의 각 엔트리에는 다음 URL이 첨부되어 있습니다.

class MyObjectSerializer(serializers.ModelSerializer):
    url = SerializerMethodField()
    # other elements

    def get_url(self, obj):
       return reverse("get_my_object", args=(obj.id,))

로딩 시 각 URL이 행에 데이터 속성으로 첨부됩니다.

var table = $('#my-table').DataTable({
   createdRow: function ( row, data, index ) {
      $(row).data("url", data["url"])
   }
});

클릭 시 다음 데이터 속성을 url에 사용합니다.

table.on( 'click', 'tbody tr', function () {
  window.location.href = $(this).data("url");
} );

URL 설정에는 항상 정수가 아닌 문자열을 사용합니다.

... r'^something/(?P<first_integer_parameter>\d+)/something_else/(?P<second_integer_parameter>\d+)/' ...

예:something/911/something_else/8/

정수의 경우 d를 문자열의 경우 w로 바꿉니다.

... r'^something/(?P<first_integer_parameter>\w+)/something_else/(?P<second_integer_parameter>\w+)/' ...

그러면 javascript에서 플레이스 홀더로 문자열을 넣을 수 있고 django 템플릿엔진도 불평하지 않습니다.

...
var url     = `{% url 'myapiname:urlname' 'xxz' 'xxy' %}?first_kwarg=${first_kwarg_value}&second_kwarg=${second_kwarg_value}`.replace('xxz',first_integer_paramater_value).replace('xxy', second_integer_parameter_value);

        var x = new L.GeoJSON.AJAX(url, {
            style: function(feature){ 
...

URL은 그대로 유지됩니다.something/911/something_else/8/이렇게 하면 파라미터로서 문자열 자리 표시자(a,b,c,d,...z)가 예상되지 않기 때문에 정수 파라미터 치환 문제를 피할 수 있습니다.

언급URL : https://stackoverflow.com/questions/2724383/calling-django-reverse-in-client-side-javascript

반응형