2012-12-18 54 views
21

Tôi có một mô hình django mà lưu trữ dữ liệu người dùng và sản phẩm từ một hình thức đầu vào:Django lưu trữ dữ liệu người dùng vô danh

def ProductSelection(request, template_name='product_selection.html'): 
    ... 
    if user.is_authenticated(): 
     user = request.user 
    else: 
     # deal with anonymous user info 
    project = Project.objects.create(
     user=user, 
     product=form.cleaned_data["product"], 
     quantity=form.cleaned_data["product_quantity"], 
    ) 

Tất nhiên điều này là tốt cho người sử dụng xác thực, nhưng tôi cũng muốn để có thể lưu trữ vô danh các dự án người dùng và nếu có thể, hãy liên kết chúng với người dùng khi họ đăng ký và xác thực.

Ý tưởng của tôi là tạo người dùng ẩn danh với tên = some_variable (dấu thời gian nối với một băm ngẫu nhiên?), Sau đó lưu tên người dùng đó vào dữ liệu phiên. Nếu tôi đảm bảo rằng biến phiên đó, nếu tồn tại, được sử dụng để ghi lại tất cả hoạt động dự án của người dùng đó, tôi sẽ có thể cập nhật các dự án với thông tin đăng nhập thực sự của người dùng khi họ đăng ký.

Điều này quá phức tạp và giòn? Tôi có nguy cơ tiết kiệm hàng ngàn hàng dữ liệu không cần thiết? Điều gì sẽ là phương pháp tối ưu cho vấn đề chung này?

Bất kỳ hướng dẫn nào về điều này sẽ được đánh giá cao.

Trả lời

16

Bạn có thể sử dụng Django's session framework để lưu trữ dữ liệu người dùng ẩn danh.

Sau đó, bạn có thể thêm một trường để mô hình Project của bạn để giữ giá trị session_key cho người dùng ẩn danh,

project = Project.objects.create(
    user=request.user, # can be anonymous user 
    session=request.session.session_key, 
    product=form.cleaned_data["product"], 
    quantity=form.cleaned_data["product_quantity"]) 

hoặc đơn giản là lưu trữ tất cả các dữ liệu một trường hợp dự án sẽ có trong phiên

if user.is_authenticated(): 
    project = Project.objects.create(
     user=request.user, 
     product=form.cleaned_data["product"], 
     quantity=form.cleaned_data["product_quantity"]) 
else: 
    # deal with anonymous user info 
    request.session['project'] = { 
     "product": form.cleaned_data["product"], 
     "quantity": form.cleaned_Data["product_quantity"]} 

Bạn có thể truy xuất dữ liệu từ phiên sau, khi tạo người dùng thích hợp.

+0

Khi tôi gặp sự cố tương tự trong quá khứ, sự cố xảy ra khi bạn cần quay lại theo một hướng khác. Giống như nếu người dùng có thể có nhiều dự án và bạn cần thực hiện một số việc như xem phiên nào thích hai dự án cụ thể. – JeffS

+0

Trong trường hợp của tôi, tôi muốn lưu trữ cả hai dữ liệu người dùng ẩn danh trong db và cũng liên kết nó với một người dùng cụ thể thông qua các phiên. Nếu 'user = request.user' trả về một đối tượng người dùng ẩn danh, sau này tôi không thể kết nối thông tin này với người dùng khi đăng ký. –

+1

Trong trường hợp đó, ví dụ đầu tiên của tôi nên làm: thêm trường để giữ giá trị 'session_key' và sau đó bạn có thể truy xuất cá thể Project mong muốn và liên kết nó với người dùng mới khi người dùng ẩn danh ngừng ẩn danh :-) –

7

Chỉ cần làm rõ, mã dưới đây là cách thực hiện các giải pháp trong trường hợp của tôi:

 project = Project.objects.create(
      session=request.session.session_key, 
      # save all other fields 
      ... 
     ) 
     if request.user.is_authenticated(): 
      project.user = request.user 
     else: 
      # make a copy of the session key 
      # this is done because the session_key changes 
      # on login/ register 
      request.session['key_copy'] = request.session.session_key 
     project.save() 

Và trong models.py tôi:

class Project(models.Model): 
    user = models.ForeignKey(User, null=True, blank=True) 
    ... 

Vì vậy, một lĩnh vực sử dụng có thể được null, và trong trường hợp này, chúng tôi sử dụng session_key để theo dõi mọi thứ.

Các vấn đề liên quan