2012-01-07 2 views
5

Tôi đang sử dụng các kiểu máy để nhận danh sách phát và các mục của nó. Nó cũng chứa kịch bản đăng nhập. Tôi đang cố gắng đặt người dùng hiện đã đăng nhập vào mô hình người dùng. Bạn có thể thấy điều này tôi đã đăng trước How to avoid this dropdown combo box?valueError in modelsforms

class playlistmodel(models.Model): 
    user = models.ForeignKey(User) 
    title = models.CharField(max_length=200) 

    def __unicode__(self): 
     return self.title 

class itemsmodel(models.Model): 
    playlist = models.ForeignKey(playlistmodel) 
    item = models.TextField() 

    def __unicode(self): 
     return self.item 

class playlistform(ModelForm): 
    class Meta: 
     model = playlistmodel 
     exclude = {'user'} 

class itemsform(ModelForm): 
    class Meta: 
     model = itemsmodel 
     exclude = {'playlist'} 

Đây là giao diện danh sách:

def playlistview(request): 
    if request.method == 'POST': 
     form = playlistform(request.POST) 
     if form.is_valid(): 
       data = form.save(commit=False) 
       data.user = request.user 
       data.save() 
       return render_to_response('playlist.html', {'data': data}) 
    else: 
     form = playlistform() 
     return render_to_response('playlist.html', {'form': form, 'user': request.user}, context_instance=RequestContext(request)) 

Playlist.html file:

https://gist.github.com/1576136

Lỗi trang:

https://gist.github.com/1576186

Nhưng tôi nhận được ValueError:

Exception Type: ValueError Exception Value: Cannot assign "<django.utils.functional.SimpleLazyObject object at 0x7f0234028f50>": "playlistmodel.user" must be a "User" instance 

Traceback: Local vars --- data.user = request.user 

Đây là settings.py tôi https://gist.github.com/1575856

Cảm ơn bạn.

+1

Chỉ trong trường hợp, xác minh bạn có [TEMPLATE_CONTEXT_PROCESSORS] mặc định (https://docs.djangoproject.com/en/1.3/ref/settings/#template-context-processors) trong 'settings.py' –

+0

Mà phiên bản Django bạn đang sử dụng? Hãy thử 'dữ liệu.thay vào đó, user_id = request.user.id'. – Alasdair

+0

@ César Tôi đã đăng liên kết cho settings.py trên phần câu hỏi của tôi. – rnk

Trả lời

0

khó để nói, nhưng tôi sẽ cố gắng này trong playlistview của bạn:

form = playlistform(request, request.POST, instance=playlistmodel) 

có lẽ bạn có thể ommit tham số cuối cùng (ví dụ = playlistmodel), vì điều này sẽ chỉ có nhu cầu nếu bạn thay đổi một đối tượng hiện

Hope this helps ...

+0

Dường như cú pháp trên sẽ không hoạt động. Nó đang hiển thị lỗi Thuộc tính. Cảm ơn bạn. – rnk

+0

Buồn :(, tất cả những gì tôi có thể nói là cú pháp này làm việc cho tôi trong một tình huống tương tự. – Jingo

0

tôi có vấn đề rất giống nhau, nhưng nó chỉ xảy ra khi không có người dùng đăng nhập (mong đợi một thể hiện AnonymousUser). Ít nhất khi siêu người dùng của tôi đăng nhập, tôi thấy không có vấn đề gì.

Mặc dù tôi đã không tìm thấy một giải pháp được nêu, có thể bạn sẽ tìm thấy một đầu mối trong này answer

Vâng, bây giờ tôi đã nhận ra rằng trong trường hợp của tôi AnonymousUser nên được lưu trữ như null trong db, nhưng để lại câu trả lời này để đăng liên kết đầu mối (chưa có quyền để lại nhận xét).

Hy vọng điều đó sẽ hữu ích!

5

Tôi biết bài đăng này cũ, nhưng nếu có ai ở đây với cùng một vấn đề, câu trả lời là request.user thực sự là một trình bao bọc cho django's auth.user. Vì vậy, request.user là một SimpleLazyObject và mục đích của nó là tránh việc khởi tạo không cần thiết và cũng triển khai cơ chế lưu bộ nhớ cache người dùng đơn giản. Để truy cập vào sử dụng thực tế (và nhanh chóng nó, khi truy cập lần đầu tiên), bạn cần phải làm:

auth.get_user(request)

này sẽ cung cấp cho bạn một thể hiện của auth.user. Nếu bạn cần thêm chi tiết về những gì đang diễn ra bên trong, hãy xem this post.