使用下拉选择字段替换文本字段

时间:2010-03-21 09:50:50

标签: django django-forms

我有三个模型类,如下所示:

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

我希望将model seriesmanufacturer的字段表示为下拉菜单而不是文本字段。我已经自定义了模型表格如下:

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 个答案:

答案 0 :(得分:2)

查看http://docs.djangoproject.com/en/dev/ref/forms/fields/#modelchoicefield,特别是开始的块

  

将调用模型的 unicode 方法,以生成对象的字符串表示形式,以便在字段的选择中使用;提供自定义表示,子类ModelChoiceField和覆盖label_from_instance。此方法将接收模型对象,并应返回适合表示它的字符串。

[然后是如何做到这一点的一个很好的例子]

HTH

史蒂夫

答案 1 :(得分:-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文件中使用TextField:

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

}