2008-10-01 19 views
10

Tüm belgelere gittim, ayrıca IRC kanalına (BTW harika bir topluluk) gittim ve bir model oluşturmanın ve seçenekleri kısıtlamanın mümkün olmadığını söylediler. 'Geçerli kullanıcının' bir ForeignKey'de olduğu alan. hayır 'kullanıcı' nesne olmadığından kod çalışmıyor TabiiModel limit_choices_to = {'user': kullanıcı}

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() 

, ama bu benim fikrimdi ve ben 'kullanıcı nesnesi göndermeye çalışıyordu: Ben bir örnekle bu anlatmaya çalışacağım '' Mevcut kullanıcıya ait projelerin seçimini sınırlamak için '' modele '' yerleştirmek istemediğim projeleri görmek istemiyorum.

Bana yardım ederseniz veya herhangi bir tavsiye verdiğinizde çok teşekkür ederim, Ben tüm app yazmak istemiyorum, sadece bununla nasıl başa çıkmak için bir ipucu. Kafamda bu 2 gün var ve ben

GÜNCELLEME :(onu anlamaya olamaz: Çözüm burada. http://collingrady.wordpress.com/2008/07/24/useful-form-tricks-in-django/ bir modele request.user gönderme

cevap

1

Bu modeli düzenleyen güncel kullanıcısı almak istiyorsanız, threadlocals kullanın. Threadlocals katman yazılımı mevcut kullanıcıyı süreç geneli değişkenine geçirir. Bu ara katman sınıflarını nasıl kullanacağınız ile ilgili belgeleri kontrol ediniz. Sonra her yerde kodunda sen İşte

user = threadlocals.get_current_user 
+0

Bunu deneyeceğim. – AbeEstrada

+5

Bu kötü bir fikir ... threadlocals ile bir hack yapmak zorunda olmanızın nedeni bu doğrulama * modelinde olmamalıdır çünkü * – Anentropic

+1

Anlaştık. İki yıl önce bu iyi bir fikir gibi görünüyordu –

-1

Hmmm, ben tam yok Sorunuzu anlayın, ancak modeli bildirdiğinizde bunu yapamazsanız, belki de kullanıcı nesnesini "gönderen" nesne sınıfının yöntemlerini geçersiz kılarken aynı şeyi gerçekleştirebilirsiniz.

+0

Örneğin, 10 proje var ama 3'te sadece değilim ben bir açılır menü almak istediğiniz kullanıcı, burada örnek görmek Ben sadece 3 proje ile kutu, ben tüm 10 projeleri göstermek istemiyorum. – AbeEstrada

4

Modelin kendisi, geçerli kullanıcı hakkında bir şey bilmiyor, ancak bu kullanıcıya model nesnelerini çalıştıran forma (ve sıfırlama formundaGerekli alan için). Yönetici sitede bu gerekiyorsa

- Sen django-granular-permissions birlikte raw_id_admin deneyebilirsiniz (http://code.google.com/p/django-granular-permissions/ ama hızla benim django çalışan alamadım ama 1,0 yüzden ... için yeterli taze gibi görünüyor).

Son olarak, eğer yönetici olarak bir selectbox'a ihtiyacınız varsa - o zaman django.contrib.admin hacklemeniz gerekir.

0

Tam olarak ne yapmak istediğinizi tam olarak anladığımı anlayamadım, ama en azından bu şekilde bir custom Manager kullanarak elde edeceğiniz iyi bir şans olduğunu düşünüyorum. Özellikle, modellerinizi geçerli kullanıcıya yönelik kısıtlamalarla tanımlamaya çalışmayın, ancak yalnızca geçerli kullanıcıyla eşleşen nesneleri döndüren bir yönetici oluşturun.

1

olduğunu edemez statik Modeli tanımında, istek döngüsünde dinamik olması gereken doğrulama bir tür .

Başka bir deyişle: bu modelin bir örneği oluşturduğunuz noktada bir Görünümde olacaksınız ve bu noktada geçerli kullanıcıya erişebilecek ve seçenekleri sınırlandırabileceksiniz.

Ardından isteği iletmek için özel bir ModelForm'a ihtiyacınız var.senin görünümünde sonra

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 

http://collingrady.wordpress.com/2008/07/24/useful-form-tricks-in-django/

:

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}) 
İlgili konular