2010-03-21 74 views
2

我有如下看三個模型類:與下拉選擇字段替換文本框

class Model(models.Model): 
    model = models.CharField(max_length=20, blank=False) 
    manufacturer = models.ForeignKey(Manufacturer) 
    date_added = models.DateField(default=datetime.today) 
    def __unicode__(self): 
     name = ''+str(self.manufacturer)+" "+str(self.model) 
     return name 

class Series(models.Model): 
    series = models.CharField(max_length=20, blank=True, null=True) 
    model = models.ForeignKey(Model) 
    date_added = models.DateField(default=datetime.today) 
    def __unicode__(self): 
     name = str(self.model)+" "+str(self.series) 
     return name 
class Manufacturer(models.Model): 
    MANUFACTURER_POPULARITY_CHOICES = (
     ('1', 'Primary'), 
     ('2', 'Secondary'), 
     ('3', 'Tertiary'), 
    ) 

    manufacturer = models.CharField(max_length=15, blank=False) 
    date_added = models.DateField(default=datetime.today) 
    manufacturer_popularity = models.CharField(max_length=1, 
     choices=MANUFACTURER_POPULARITY_CHOICES) 
    def __unicode__(self): 
     return self.manufacturer 

我想有字段modelseries並表示爲下拉列表,而不是文本字段manufacturer。我已經定製了模型的形式如下:

class SeriesForm(ModelForm): 
    series = forms.ModelChoiceField(queryset=Series.objects.all()) 
    class Meta: 
     model = Series 
     exclude = ('model', 'date_added',) 

class ModelForm(ModelForm): 
    model = forms.ModelChoiceField(queryset=Model.objects.all()) 
    class Meta: 
     model = Model 
     exclude = ('manufacturer', 'date_added',) 

class ManufacturerForm(ModelForm): 
    manufacturer = forms.ModelChoiceField(queryset=Manufacturer.objects.all()) 
    class Meta: 
     model = Manufacturer 
     exclude = ('date_added',) 

然而,下拉菜單被填充在各自的類unicode的...我怎麼能進一步自定義此得到最終的結果我想要什麼?

另外,我怎樣才能填寫正確的數據編輯窗體?目前只有SeriesForm被填充。所有這一切的出發點是從另一個類,它的聲明如下:

class CommonVehicle(models.Model): 
    year = models.ForeignKey(Year) 
    series = models.ForeignKey(Series) 
    .... 

    def __unicode__(self): 
     name = ''+str(self.year)+" "+str(self.series) 
     return name 

回答

2

退房http://docs.djangoproject.com/en/dev/ref/forms/fields/#modelchoicefield,特別是啓動

塊模型的統一方法將被調用生成用於字段選擇的對象的字符串表示;提供自定義表示,ModelChoiceField子類和覆蓋label_from_instance。這個方法將接收一個模型對象,並且應該返回一個適合表示它的字符串。

[有那麼下面的如何做到這一點的好例子]

HTH

史蒂夫

+0

這正是我需要的....讓我試試吧。日Thnx – Stephen 2010-03-22 08:23:54

-3

.h文件:(UIView的創建)

#import <UIKit/UIKit.h> 



@class NIDropDown; 

@protocol NIDropDownDelegate 

- (void) niDropDownDelegateMethod: (NIDropDown *) sender; 

@end 



@interface NIDropDown : UIView <UITableViewDelegate, UITableViewDataSource> 

{ 

    NSString *animationDirection; 

    UIImageView *imgView; 

} 

@property (nonatomic, retain) id <NIDropDownDelegate> delegate; 

@property (nonatomic, retain) NSString *animationDirection; 

-(void)hideDropDown:(UIButton *)b; 

- (id)showDropDown:(UIButton *)b :(CGFloat *)height :(NSArray *)arr :(NSArray *)imgArr :(NSString *)direction; 

@end 

.m文件:

#import "NIDropDown.h" 

#import "QuartzCore/QuartzCore.h" 



@interface NIDropDown() 

@property(nonatomic, strong) UITableView *table; 

@property(nonatomic, strong) UIButton *btnSender; 

@property(nonatomic, retain) NSArray *list; 

@property(nonatomic, retain) NSArray *imageList; 

@end 



@implementation NIDropDown 

@synthesize table; 

@synthesize btnSender; 

@synthesize list; 

@synthesize imageList; 

@synthesize delegate; 

@synthesize animationDirection; 



- (id)showDropDown:(UIButton *)b :(CGFloat *)height :(NSArray *)arr :(NSArray *)imgArr :(NSString *)direction { 

    btnSender = b; 

    animationDirection = direction; 

    self.table = (UITableView *)[super init]; 

    if (self) { 

     // Initialization code 

     CGRect btn = b.frame; 

     self.list = [NSArray arrayWithArray:arr]; 

     self.imageList = [NSArray arrayWithArray:imgArr]; 

     if ([direction isEqualToString:@"up"]) { 

      self.frame = CGRectMake(btn.origin.x, btn.origin.y, btn.size.width, 0); 

      self.layer.shadowOffset = CGSizeMake(-5, -5); 

     }else if ([direction isEqualToString:@"down"]) { 

      self.frame = CGRectMake(btn.origin.x, btn.origin.y+btn.size.height, btn.size.width, 0); 

      self.layer.shadowOffset = CGSizeMake(-5, 5); 

     } 



     self.layer.masksToBounds = NO; 

     self.layer.cornerRadius = 8; 

     self.layer.shadowRadius = 5; 

     self.layer.shadowOpacity = 0.5; 



     table = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, btn.size.width, 0)]; 

     table.delegate = self; 

     table.dataSource = self; 

     table.layer.cornerRadius = 5; 

     //table.backgroundColor = [UIColor clearColor]; 

     table.backgroundColor = [UIColor scrollViewTexturedBackgroundColor];//[UIColor colorWithRed:0.239 green:0.239 blue:0.239 alpha:1]; 

     table.separatorStyle = UITableViewCellSeparatorStyleNone; 

     table.separatorColor = [UIColor clearColor]; 



     [UIView beginAnimations:nil context:nil]; 

     [UIView setAnimationDuration:0.5]; 

     if ([direction isEqualToString:@"up"]) { 

      self.frame = CGRectMake(btn.origin.x, btn.origin.y-*height, btn.size.width, *height); 

     } else if([direction isEqualToString:@"down"]) { 

      self.frame = CGRectMake(btn.origin.x, btn.origin.y+btn.size.height, btn.size.width, *height); 

     } 

     table.frame = CGRectMake(0, 0, btn.size.width, *height); 

     [UIView commitAnimations]; 

     [b.superview addSubview:self]; 

     [self addSubview:table]; 

    } 

    return self; 

} 



-(void)hideDropDown:(UIButton *)b { 

    CGRect btn = b.frame; 



    [UIView beginAnimations:nil context:nil]; 

    [UIView setAnimationDuration:0.5]; 

    if ([animationDirection isEqualToString:@"up"]) { 

     self.frame = CGRectMake(btn.origin.x, btn.origin.y, btn.size.width, 0); 

    }else if ([animationDirection isEqualToString:@"down"]) { 

     self.frame = CGRectMake(btn.origin.x, btn.origin.y+btn.size.height, btn.size.width, 0); 

    } 

    table.frame = CGRectMake(0, 0, btn.size.width, 0); 

    [UIView commitAnimations]; 

} 



- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 

    return 1; 

} 



-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 

    return 40; 

} 



- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 

    return [self.list count]; 

} 





- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    static NSString *CellIdentifier = @"Cell"; 



    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    if (cell == nil) { 

     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 

     if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad){ 

      cell.textLabel.font = [UIFont systemFontOfSize:20]; 

     } else { 

      cell.textLabel.font = [UIFont systemFontOfSize:8]; 

     } 

     cell.textLabel.textAlignment = UITextAlignmentCenter; 

    } 

    if ([self.imageList count] == [self.list count]) { 

     //cell.textLabel.text =[list objectAtIndex:indexPath.row]; 

     //cell.imageView.image = [imageList objectAtIndex:indexPath.row]; 

    } else if ([self.imageList count] > [self.list count]) { 

     // cell.textLabel.text =[list objectAtIndex:indexPath.row]; 

     if (indexPath.row < [imageList count]) { 

      // cell.imageView.image = [imageList objectAtIndex:indexPath.row]; 

     } 

    } else if ([self.imageList count] < [self.list count]) { 

     cell.textLabel.text =[list objectAtIndex:indexPath.row]; 

     if (indexPath.row < [imageList count]) { 

      //cell.imageView.image = [imageList objectAtIndex:indexPath.row]; 

     } 

    } 



    cell.textLabel.textColor = [UIColor blackColor]; 



    UIView * v = [[UIView alloc] init]; 

    v.backgroundColor = [UIColor grayColor]; 

    cell.selectedBackgroundView = v; 



    return cell; 

} 



- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 

    [self hideDropDown:btnSender]; 



    UITableViewCell *c = [tableView cellForRowAtIndexPath:indexPath]; 

    //[btnSender setTitle:c.textLabel.text forState:UIControlStateNormal]; 

    NSUserDefaults *prefCountOne = [NSUserDefaults standardUserDefaults]; 

    [prefCountOne setObject:c.textLabel.text forKey:@"TYPETEXT"]; 



    for (UIView *subview in btnSender.subviews) { 

     if ([subview isKindOfClass:[UIImageView class]]) { 

      [subview removeFromSuperview]; 

     } 

    } 

    imgView.image = c.imageView.image; 

    imgView = [[UIImageView alloc] initWithImage:c.imageView.image]; 

    imgView.frame = CGRectMake(5, 5, 25, 25); 

    [btnSender addSubview:imgView]; 

    [self myDelegate]; 

} 



- (void) myDelegate { 

    [self.delegate niDropDownDelegateMethod:self]; 

} 

使用文本字段中.m文件:

- (IBAction) fnDisplayCategory:(id)sender { 

[pTxtCategory resignFirstResponder]; 

if(pBtnCategory == nil) { 

CGFloat f = 200; 

pBtnCategory = [[NIDropDownForTwoArrays alloc]showDropDown:pTxtCategory :&f :pArCategory :@"down" :1]; 

pBtnCategory.delegate = self; 

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 

[defaults setObject:@"First" forKey:@"DropDown"]; 

     [[NSUserDefaults standardUserDefaults] synchronize]; 

} 

else { 

[pBtnCategory hideDropDown:pTxtCategory]; 

[self rel]; 

} 

} 



- (void)rel { 

    pBtnCategory = nil; 

}