[장고] 실무에서 사용했던 장고 정보 모음 ADMIN위주

Computer 비관심/Django|2018. 8. 15. 14:51
반응형

장고에 대한 정보를 얻기가 쉽지가 않지만 해외 장고 유저가 적은 글을 보면 쉽게 찾을 수 있다. 하지만 장고어드민를 제대로 사용할 수 있는 정보를 찾기는 정말 어렵다고 생각한다. 하지만 장고를 사용하는데 장고어드민을 제대로 활용하지 못 한다면 장고프레임웍의 큰 장점을 버리는 셈이다. 아래 자료들은 5개월간 장고 프로그래머로써 찾았던 어드민, 혹은 장고 관련된 실무에서 발생하는 문제 해결에 관련된 자료를 모은 것을 올린것이다.

(다 지우려 했는데 혹시라도 필요하실 분들이 있을지도 모른다는 생각에 남기게 되었습니다.)


0. 커스텀 유저 만들기

https://www.youtube.com/watch?v=0bAJV0zNWQw


1. AbstractBaseUser 대신 AbstractUser를 서브클래스함

your_app.models.py

 

from django.contrib.auth.models import AbstractUser

 

class User(AbstractUser):

        pass

 

이렇게 하면 User는 디폴트 펑션을 가지게 된다.

 

2. 유저모델 세팅

settings.py

AUTH_USER_MODEL = 'your_app.User'

 

3. 어드민에 유저모델 등록

your_app/admin.py

 

from django.contrib import admin

from django.contrib.auth.admin import UserAdmin

 

from .models import User

 

@admin.register(User)

class UserAdmin(Useradmin):

        pass

 

 

this provides a Custom User model with  all the functionality of the default User model but, with the flexibility of a Custom User model in case you ever need it in the future

 

These 10 lines of code provide immediate benefit even if you don't need User table customization

- cleanly and simply customize the User Meta option, if for example you want to add custom permission to User

 

-Easily customize User methods

 

- Easily intergate third-party package admin functionality into User admin 


1. 장고 어드민 폼 수정 - 장고 어드민에서 모델 폼으로 input을 만들때 속성을 바꾸어서 서버에서 클라이언트로 보내주는 방법을 설명하는 링크

https://stackoverflow.com/questions/910169/resize-fields-in-django-admin 



2. inversion of control (제어의 역전) -장고 프레임워크에 대해서 더 깊게 이해하고 싶으면 프레임워크 - 프레임워크는 제어의 역전과 관련이 있다 - 라는 것이 무엇인지 알아야 한다. 이 유튜브 동영상은 inversion of control 에 대해 심플하게 설명한다.

(간단히 말하면 프레임워크 안에 개발자가 코드를 작성하면 프레임워크의 흐름에 맞게 그 코드를 불러내고 실행한다. 다르게 말하면 대부분의 코드의 흐름은 프레임워크가 움직이고 특정 부분만 개발자가 제어한다.)

https://www.youtube.com/watch?v=vFzP2SaMyA0



3. get_context_data 메서드를 만들어서 데이터를 받는 대신에 템플릿에서 view를 사용해서 view클레스에 있는 변수, 메서드에 접근하기

https://reinout.vanrees.org/weblog/2014/05/19/context.html



4. django-widget-tweaks 장고 폼의 속성들을 템플릿에서 바꿀 수 있도록 도와주는 패키지

https://pypi.org/project/django-widget-tweaks/



5. 클라이언트의 json 파일 장고로 넘길 때 발생하는 문제 해결 방법 

https://stackoverflow.com/questions/10035627/django-reading-array-of-json-objects-from-querydict 

장고 서버에서 받을 경우 itemList[0][id]이런식으로 각각 나온다.

request.POST['itemList']로 받을때 none이 나온다.

 

이 문제를 해결하기 위해서는

ajax로 배열딕셔너리 데이타를 

itemList: JSON.stringify(test),

이런식으로 넘겨야 한다.

lists = json.loads(request.POST['itemList'])

이렇게 해야함



6. 장고 어드민에 커스텀 액션 버튼 만들기 - 관리자페이지에서 관련 페이지 이동 같은 기능 만들때 유용

https://medium.com/@hakibenita/how-to-add-custom-action-buttons-to-django-admin-8d266f5b0d41



7. 장고 1,2,3,4, 숫자로 페이징처리 하기 + 숫자 범위 제한하기

https://jupiny.com/2016/11/22/limit-pagination-page-numbers-range/



8.장고어드민 깊게 파헤치는 유용한 동영상

https://www.youtube.com/watch?v=5ajZMpTcUZU



9. 장고 셀렉트 필드에서 -------로 처음 필드가 나오는거 지우기

https://stackoverflow.com/questions/3935602/how-to-remove-the-unselected-item-in-a-select-and-radio-input-in-django



10. 장고 어드민 템플릿에 데이터 보내기

https://stackoverflow.com/questions/9220042/django-how-to-pass-custom-variables-to-context-to-use-in-custom-admin-template 

 

https://stackoverflow.com/questions/36405426/pass-data-to-master-template 

 

add_view.context_data.update({'to': to, 'gender_type': gender_type, 'booking_id': booking_id}) 

 

이렇게 보내는 방법도 있음



11. many to many 테이블의 IT로 정렬하기

https://stackoverflow.com/questions/10331528/django-manytomany-self-relation-order-by-the-middle-table-id 


오브젝트를 받아서 할때는 테이블명 말고 그 테이블을 칭하는 오브젝트를 적음


obj.image.through._meta.db_table+'.id') 

for i in r.image.all().order_by(r.image.through._meta.db_table+'.id')

for w in obj.image.order_by(obj.image.through._meta.db_table+'.id'): 

 

즉 클래스의 인스턴스(오브젝트들)의 이미지필드를 middle table의 아이디로 정렬 함



12. 장고 어드민 템플릿 구조 - 어드민 페이지를 상속하고 변경할 때 유용한 자료 

https://manikos.github.io/django-admin-template-structure



13. 장고 어드민 객체 계층 구조 -어드민 필드 수정할 때 좋은 자료

https://searchcode.com/codesearch/view/54684984/


adminform

fieldset 

- fileldset.classes 

- name

- description

 

line.fields

filed.filed.name

field.is_readonly

filed.errors

field.is_checkbox

filed.label_tag - 한글로 지정한것 보이게 할 수 있음.

field.contents

field.value


14. 장고에서 row sql query 사용하기

https://gist.github.com/tkrajina/11378945 



15. 모델에 종속되지 않는 어드민/url

https://stackoverflow.com/questions/11288320/new-url-on-django-admin-independent-of-the-apps



16. 장고 어드민 폼과 오브젝트

https://buxty.com/b/2010/04/django-adminform-objects-and-templates/ 



17. 장고의 흐름 (장고 플로우차트) -어쩌면  이것을 익히는 것이 장고의 기본일지도 모른다. 링크는 다른 형태의 플로우차트를 보여주니 참고 하면 좋을듯

http://hitesh.in/2009/django-flow/



18. 장고 포팅관련 링크( 왜 저장 해놨는지 모르겠다..)

https://fbdjango.wordpress.com/2014/01/27/183432721693235_635727396463763/ 




19. 어드민 쿼리셋 필터링 - 자신이 원하는 정보만 어드민에 뿌려주려면 어떻게 해야하는지 나오는 자료

https://stackoverflow.com/questions/12354099/override-default-queryset-in-django-admin 

 

겟 리스트뷰에서 쓰는것 예 

https://stackoverflow.com/questions/36474515/how-to-get-filtered-queryset-in-django-admin 



20. 자주 썼던  jquery post 형식 - 계속해서 복붙해서 썼었음


$.ajax({
type: "POST",
url: "{% url 'web:review_list' profile_id=master_profile.pk %}",
data: {
'type':'write',
'rating':$('#createPersonStar').val(),
'reviewContent':$('#reviewContent').val(),
csrfmiddlewaretoken: '{{ csrf_token }}'
},
success: function(result) {
self.review_list.unshift(result['review_list']);
}
});

return HttpResponse(json.dumps(data), content_type="application/json")

21. 장고 폼셋 튜토리얼

http://whoisnicoleharris.com/2015/01/06/implementing-django-formsets.html 

 

폼에 데이터가 미리 들어가는 방법

job = UserJob.objects.all()[0]

form = UserJobForm(request.POST or None, instance=job)

 

----------------------------

 

UserJobFormset = modelformset_factory(UserJob, form = UserjobForm)

formset = UserJobFormset(request.POST or None)  #새로운 클래스를 이니시에이트 함



22. 장고 form 기본 기능중 하나 url에 적힌 text를 폼셋에서 받을 수 있음

&to={{ original.mobile }}&text=%EA%B3%A0%EA% 



23. 장고 어드민 템플릿에 기본으로 전달되는 모델 객체 받기

템플릿에 {{original}}를 사용하면 모델의 객체를 받을 수 있음


https://stackoverflow.com/questions/4635548/accessing-the-object-in-a-django-admin-template 



24. 장고 orm 쿼리 만들때 유용한 블로그 페이지

https://milooy.wordpress.com/2016/06/23/django-models-2-making-queries/



25. 장고 admin changelist에서 컨텍스트 모델에 속한 오브젝트들 받기

https://stackoverflow.com/questions/16096528/how-can-i-get-the-object-in-django-admin-chnage-list-template 

 

{% for object in cl.result_list %}
{{ object.field명 }}
{% endfor %}

 쿼리셋형태로 오브젝트들을 받을 수 있다.


댓글()

[1] 장고 채널스(django channels) 웹소켓 에코

Computer 비관심/Django|2017. 2. 17. 10:28
반응형


장고 채널은 장고 1.10 이상에서 지원


1.설치

# requirements.txt

asgi-redis==1.0.0
channels==0.17.3
daphne==0.15.0
Django==1.10.4

requirements.txt 파일을 만든 뒤 pip install -r requirements.txt를 입력하여 requirements.txt에 있는 모듈을 모두 설치 한다.




2. 앱 세팅


- 프로젝트를 만들고 앱을 만든다. 


- settings.py의 INSTALLED_APPS에 channels와 새로 생성한 앱 추가한다. (여기선 앱의 이름을 chat 이라고 만듬)

# settings.py

INSTALLED_APPS = (
    ...
    'channels',
    'chat',
)

...

CHANNEL_LAYERS = {
    'default': {
        'BACKEND': 'asgiref.inmemory.ChannelLayer',
        'ROUTING': 'django_channels.routing.channel_routing',
    },
}

3.routing


- 라우팅 처리를 위하여 위에 설정한 바와 같이 django_channels라는 폴더에 routing.py 파일을 만든다.  


# routing.py
from channels.routing import route

channel_routing = [
    route('websocket.receive', 'chat.consumers.ws_echo'),
]

4. consumers.py


# consumers.py

def ws_echo(message):
    message.reply_channel.send({
        'text': message.content['text'],
    })


소켓이 접속이 되는지 확인하기 위해 로컬호스트에 접속하여 소켓을 만들어 아래를 입력합니다.


// http인지 https인지 확인 하여 그것에 맞는 소켓을 웹소켓 프로토콜을 선택
var ws_scheme = window.location.protocol == "https:" ? "wss" : "ws";
ws = new WebSocket(ws_scheme +'://' +  window.location.host + '/');


이렇게 소켓에 접속 된 것을 볼수 있습니다.


// Create a new WebSocket
ws = new WebSocket((window.location.protocol == 'http:' ? 'ws://' : 'wss://') +  window.location.host + '/')

// ws.onmessage를 통해 메시지를 받으면 알림
ws.onmessage = function(message) {
  alert(message.data); 
}
// ws.onpen을 통해 소켓이 열리면 메시지를 보냄
ws.onopen = function() {
  ws.send('Hello, world');
}

send의 키를 text라고 하고 키 값으로 브라우저에 보낼 내용을 적습니다. 아래의 예는 브라우저에서 보낸 내용을 매개변수 message로 받아 오브젝트를 생성하여 .content['text']로 브라우저에서 보낸 내용을 다시 브라우저에 전달 하였습니다.


content 딕셔너리의 text라는 키가 있음. 그 키에는 브라우저에서 보내온 값이 있다.


message오브젝트에 data속성에 채널에서 보낸 내용이 들어 있다.


ws.readyState 를 통해 소켓의 상태를 확인 할 수 있음.  

WebSocket.OPEN  ->1 반환 소켓이 열려있음 

WebSocket.CLOSED ->3 반환 소켓이 닫힘


※ 이대로 하면 websocket.receive이 작동안됨을 알 수 있다. 이유는 다음과 같다.

위의 모듈대로 설치하게 되면  Twisted 가 최신버전으로 깔리게 되는데 Twisted 16.2.0만 제대로 작동한다는 이야기가 있다.

즉, 제대로 작동하기 위해서는 Twisted를 지운뒤 16.2.0버전으로 다시 설치하여야 한다.





참고


글이 적어서 좋았던 튜토리얼

https://www.sourcelair.com/blog/articles/115/django-channels-chat

소켓연결에서 http와 https에 따른 ws와 wss 선택  

https://blog.heroku.com/in_deep_with_django_channels_the_future_of_real_time_apps_in_django

채널 공식 문서

https://media.readthedocs.org/pdf/channels/latest/channels.pdf

twisted 문제 

http://stackoverflow.com/questions/38322197/django-channels-websocket-receive-is-not-handled



댓글()