سؤال

لقد ذهبت إلى جميع الوثائق، كما ذهبت إلى قناة IRC (راجع للشغل مجتمع عظيم) وأخبروني أنه من غير الممكن إنشاء نموذج وتقييد الخيارات في حقل حيث يكون "المستخدم الحالي" موجودًا في ExternalKey.سأحاول توضيح ذلك بمثال:

class Project(models.Model):
  name = models.CharField(max_length=100)
  employees = models.ManyToManyField(Profile, limit_choices_to={'active': '1'})

class TimeWorked(models.Model):
  project = models.ForeignKey(Project, limit_choices_to={'user': user})
  hours = models.PositiveIntegerField()

بالطبع هذا الرمز لا يعمل لأنه لا يوجد كائن "مستخدم"، ولكن هذه كانت فكرتي وكنت أحاول إرسال الكائن "مستخدم" إلى النموذج فقط للحد من الاختيارات حيث يكون لدى المستخدم الحالي مشاريع، ولا أفعل ذلك لا أريد رؤية المشاريع التي لست فيها.

شكرًا جزيلاً لك إذا كان بإمكانك مساعدتي أو إعطائي أي نصيحة، لا أريد أن تكتب كل التطبيق، فقط نصيحة حول كيفية التعامل مع ذلك.لدي يومين مع هذا في رأسي ولا أستطيع معرفة ذلك :(

تحديث:الحل هنا: http://collingrady.wordpress.com/2008/07/24/useful-form-tricks-in-django/ إرسال request.user إلى نموذج.

هل كانت مفيدة؟

المحلول

استخدم Threadlocals إذا كنت تريد الحصول عليه حاضِر المستخدم الذي يقوم بتحرير هذا النموذج.تضع البرمجيات الوسيطة Threadlocals المستخدم الحالي في متغير على مستوى العملية.خذ هذه الوسيطة

from threading import local

_thread_locals = local()
def get_current_user():
    return getattr(getattr(_thread_locals, 'user', None),'id',None)

class ThreadLocals(object):
    """Middleware that gets various objects from the
    request object and saves them in thread local storage."""
    def process_request(self, request):
        _thread_locals.user = getattr(request, 'user', None)

تحقق من الوثائق حول كيفية استخدام فئات البرامج الوسيطة.ثم في أي مكان في الرمز يمكنك الاتصال به

user = threadlocals.get_current_user

نصائح أخرى

والنموذجي نفسه لا يعرف شيئا عن المستخدم الحالي ولكن هل يمكن أن تعطي هذا المستخدم في طريقة عرض إلى النموذج الذي تعمل نماذج الكائنات (وفي شكل choices إعادة تعيين لحقل ضروري).

إذا كنت بحاجة إلى هذا على موقع الإدارة - يمكنك محاولة raw_id_admin جنبا إلى جنب مع django-granular-permissions ( http://code.google.com/p/django-granular-permissions/ ولكن لم أستطع الحصول عليه بسرعة العمل على بلدي جانغو ولكن يبدو أن تكون طازجة بما فيه الكفاية ل 1.0 لذلك ...).

وأخيرا، إذا كنت بحاجة بالسلاح selectbox في المشرف - ثم عليك أن الإختراق django.contrib.admin نفسها

وهذا يحد من الخيارات للمستخدم الحالي هو نوع من التحقق من صحة هذا يجب أن يحدث بشكل حيوي في دورة الطلب، وليس في تعريف نموذج ثابت.

وبعبارة أخرى: عند النقطة التي كنت تقوم بإنشاء <م> المثال هذا النموذج سوف تكون في طريقة عرض وعند هذه النقطة سيكون لديك الوصول إلى المستخدم الحالي ويمكن أن تحد من الخيارات.

وبعد ذلك كنت في حاجة الى ModelForm مخصص لتمرير في request.user ل، راجع المثال هنا: http://collingrady.wordpress.com/2008/ 24/7 / مفيدة، شكل الحيل في جانغو /

from datetime import datetime, timedelta
from django import forms
from mysite.models import Project, TimeWorked

class TimeWorkedForm(forms.ModelForm):
    def __init__(self, user, *args, **kwargs):
        super(ProjectForm, self).__init__(*args, **kwargs)
        self.fields['project'].queryset = Project.objects.filter(user=user)

    class Meta:
        model = TimeWorked

وبعد ذلك من وجهة نظرك:

def time_worked(request):
    form = TimeWorkedForm(request.user, request.POST or None)
    if form.is_valid():
        obj = form.save()
        # redirect somewhere
    return render_to_response('time_worked.html', {'form': form})

واستخدام طرق العرض العامة على أساس طبقي في جانغو 1.8.x / 2.7.x بيثون، وهنا هو ما أنا وزملائي جاء مع:

في models.py:

# ...

class Proposal(models.Model):
    # ...

    # Soft foreign key reference to customer
    customer_id = models.PositiveIntegerField()

    # ...

في forms.py:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.forms import ModelForm, ChoiceField, Select
from django import forms
from django.forms.utils import ErrorList
from django.core.exceptions import ValidationError
from django.utils.translation import ugettext as _
from .models import Proposal
from account.models import User
from customers.models import customer



def get_customers_by_user(curUser=None):
    customerSet = None

    # Users with userType '1' or '2' are superusers; they should be able to see
    # all the customers regardless. Users with userType '3' or '4' are limited
    # users; they should only be able to see the customers associated with them
    # in the customized user admin.
    # 
    # (I know, that's probably a terrible system, but it's one that I
    # inherited, and am keeping for now.)
    if curUser and (curUser.userType in ['1', '2']):
        customerSet = customer.objects.all().order_by('company_name')
    elif curUser:
        customerSet = curUser.customers.all().order_by('company_name')
    else:
        customerSet = customer.objects.all().order_by('company_name')

    return customerSet


def get_customer_choices(customerSet):
    retVal = []

    for customer in customerSet:
        retVal.append((customer.customer_number, '%d: %s' % (customer.customer_number, customer.company_name)))

    return tuple(retVal)


class CustomerFilterTestForm(ModelForm):

    class Meta:
        model = Proposal
        fields = ['customer_id']

    def __init__(self, user=None, *args, **kwargs):
        super(CustomerFilterTestForm, self).__init__(*args, **kwargs)
        self.fields['customer_id'].widget = Select(choices=get_customer_choices(get_customers_by_user(user)))

# ...

في views.py:

# ...

class CustomerFilterTestView(generic.UpdateView):
    model = Proposal
    form_class = CustomerFilterTestForm
    template_name = 'proposals/customer_filter_test.html'
    context_object_name = 'my_context'
    success_url = "/proposals/"

    def get_form_kwargs(self):
        kwargs = super(CustomerFilterTestView, self).get_form_kwargs()
        kwargs.update({
            'user': self.request.user,
        })
        return kwargs

في قوالب / اقتراحات / customer_filter_test.html:

{% extends "base/base.html" %}

{% block title_block %}
<title>Customer Filter Test</title>
{% endblock title_block %}

{% block header_add %}
<style>
    label {
        min-width: 300px;
    }
</style>
{% endblock header_add %}

{% block content_body %}
<form action="" method="POST">
    {% csrf_token %}
    <table>
        {{ form.as_table }}
    </table>
    <input type="submit" value="Save" class="btn btn-default" />
</form>
{% endblock content_body %}

وأنا لست متأكدا من أنني أفهم تماما بالضبط ما تريد القيام به، ولكن أعتقد أن هذا هناك فرصة جيدة لأنك سوف تحصل على جزء على الأقل في الطريق إلى هناك باستخدام <لأ href = "HTTPS: // مستندات .djangoproject.com / EN / ديف / المواضيع / ديسيبل / مدراء / # العرف مديري ونموذج الميراث "يختلط =" نوفولو noreferrer "> مدير مخصص . على وجه الخصوص، لا في محاولة لتحديد النماذج الخاصة بك مع فرض قيود على المستخدم الحالي، ولكن إنشاء مدير ترجع فقط الكائنات التي تتناسب مع المستخدم الحالي.

وهممم، أنا لا أفهم تماما سؤالك. ولكن إذا كنت لا تستطيع أن تفعل ذلك عندما تقوم بتعريف نموذج ربما يمكنك تحقيق نفس الشيء مع أساليب تجاوز من فئة من الأشياء حيث كنت "إرسال" كائن المستخدم، ربما تبدأ مع منشئ.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top