@@ -186,7 +186,7 @@ class Variable(RefinableObject):
186186 show = True ,
187187 attr = MISSING ,
188188 gui = Namespace (
189- call_target = Field ,
189+ call_target__cls = Field ,
190190 show = False ,
191191 required = False ,
192192 ),
@@ -248,19 +248,21 @@ def value_to_q(variable, op, value_string_or_f):
248248 else :
249249 return r
250250
251- @staticmethod
252- def from_model (model , field_name = None , model_field = None , ** kwargs ):
251+ @classmethod
252+ def from_model (cls , model , field_name = None , model_field = None , ** kwargs ):
253253 return member_from_model (
254+ cls = cls ,
254255 model = model ,
255256 factory_lookup = _variable_factory_by_django_field_type ,
256257 field_name = field_name ,
257258 model_field = model_field ,
258259 defaults_factory = lambda model_field : {},
259260 ** kwargs )
260261
261- @staticmethod
262- def expand_member (model , field_name = None , model_field = None , ** kwargs ):
262+ @classmethod
263+ def expand_member (cls , model , field_name = None , model_field = None , ** kwargs ):
263264 return expand_member (
265+ cls = cls ,
264266 model = model ,
265267 factory_lookup = _variable_factory_by_django_field_type ,
266268 field_name = field_name ,
@@ -281,7 +283,7 @@ def case_sensitive(cls, call_target=None, **kwargs):
281283
282284 @classmethod
283285 @class_shortcut (
284- gui__call_target = Field . choice ,
286+ gui__call_target__attribute = ' choice' ,
285287 )
286288 def choice (cls , call_target = None , ** kwargs ): # pragma: no cover
287289 """
@@ -295,7 +297,21 @@ def choice(cls, call_target=None, **kwargs): # pragma: no cover
295297
296298 @classmethod
297299 @class_shortcut (
298- gui__call_target = Field .choice_queryset ,
300+ gui__call_target__attribute = 'multi_choice' ,
301+ )
302+ def multi_choice (cls , call_target = None , ** kwargs ): # pragma: no cover
303+ """
304+ Field that has one value out of a set.
305+ :type choices: list
306+ """
307+ setdefaults_path (kwargs , dict (
308+ gui__choices = kwargs .get ('choices' ),
309+ ))
310+ return call_target (** kwargs )
311+
312+ @classmethod
313+ @class_shortcut (
314+ gui__call_target__attribute = 'choice_queryset' ,
299315 op_to_q_op = lambda op : 'exact' ,
300316 value_to_q_lookup = 'name' ,
301317 value_to_q = choice_queryset_value_to_q ,
@@ -319,84 +335,109 @@ def choice_queryset(cls, choices, call_target=None, **kwargs):
319335
320336 @classmethod
321337 @class_shortcut (
322- class_call_target = "choice_queryset" ,
323- gui__call_target = Field . multi_choice_queryset ,
338+ call_target__attribute = "choice_queryset" ,
339+ gui__call_target__attribute = ' multi_choice_queryset' ,
324340 )
325341 def multi_choice_queryset (cls , call_target = None , ** kwargs ):
326342 return call_target (** kwargs )
327343
328344 @classmethod
329345 @class_shortcut (
330- gui__call_target = Field . boolean ,
346+ gui__call_target__attribute = ' boolean' ,
331347 value_to_q = boolean_value_to_q ,
332348 )
333349 def boolean (cls , call_target = None , ** kwargs ):
334350 return call_target (** kwargs )
335351
336352 @classmethod
337353 @class_shortcut (
338- gui__call_target = Field . boolean_tristate ,
354+ gui__call_target__attribute = ' boolean_tristate' ,
339355 value_to_q = boolean_value_to_q ,
340356 )
341357 def boolean_tristate (cls , call_target = None , ** kwargs ):
342358 return call_target (** kwargs )
343359
344360 @classmethod
345361 @class_shortcut (
346- gui__call_target = Field . integer ,
362+ gui__call_target__attribute = ' integer' ,
347363 )
348364 def integer (cls , call_target = None , ** kwargs ):
349365 return call_target (** kwargs )
350366
351367 @classmethod
352368 @class_shortcut (
353- gui__call_target = Field . float ,
369+ gui__call_target__attribute = ' float' ,
354370 )
355371 def float (cls , call_target = None , ** kwargs ):
356372 return call_target (** kwargs )
357373
358374 @classmethod
359375 @class_shortcut (
360- gui__call_target = Field . url ,
376+ gui__call_target__attribute = ' url' ,
361377 )
362378 def url (cls , call_target = None , ** kwargs ):
363379 return call_target (** kwargs )
364380
365381 @classmethod
366382 @class_shortcut (
367- gui__call_target = Field . time ,
383+ gui__call_target__attribute = ' time' ,
368384 )
369385 def time (cls , call_target = None , ** kwargs ):
370386 return call_target (** kwargs )
371387
372388 @classmethod
373389 @class_shortcut (
374- gui__call_target = Field . datetime ,
390+ gui__call_target__attribute = ' datetime' ,
375391 )
376392 def datetime (cls , call_target = None , ** kwargs ):
377393 return call_target (** kwargs )
378394
379395 @classmethod
380396 @class_shortcut (
381- gui__call_target = Field . date ,
397+ gui__call_target__attribute = ' date' ,
382398 )
383399 def date (cls , call_target = None , ** kwargs ):
384400 return call_target (** kwargs )
385401
386402 @classmethod
387403 @class_shortcut (
388- gui__call_target = Field . email ,
404+ gui__call_target__attribute = ' email' ,
389405 )
390406 def email (cls , call_target = None , ** kwargs ):
391407 return call_target (** kwargs )
392408
393409 @classmethod
394410 @class_shortcut (
395- gui__call_target = Field . decimal ,
411+ gui__call_target__attribute = ' decimal' ,
396412 )
397413 def decimal (cls , call_target = None , ** kwargs ):
398414 return call_target (** kwargs )
399415
416+ @classmethod
417+ @class_shortcut (
418+ call_target__attribute = 'choice_queryset' ,
419+ )
420+ def foreign_key (cls , model_field , model , call_target , ** kwargs ):
421+ del model
422+ setdefaults_path (
423+ kwargs ,
424+ choices = model_field .foreign_related_fields [0 ].model .objects .all (),
425+ )
426+ return call_target (model_field = model_field , ** kwargs )
427+
428+ @classmethod
429+ @class_shortcut (
430+ call_target__attribute = 'multi_choice_queryset' ,
431+ )
432+ def many_to_many (cls , call_target , model_field , ** kwargs ):
433+ setdefaults_path (
434+ kwargs ,
435+ choices = model_field .remote_field .model .objects .all (),
436+ extra__django_related_field = True ,
437+ )
438+ kwargs ['model' ] = model_field .remote_field .model
439+ return call_target (model_field = model_field , ** kwargs )
440+
400441
401442class StringValue (text_type ):
402443 def __new__ (cls , s ):
@@ -446,6 +487,13 @@ class CarQuery(Query):
446487 endpoint = Refinable ()
447488 """ :type: tri.declarative.Namespace """
448489
490+ member_class = Refinable ()
491+ form_class = Refinable ()
492+
493+ class Meta :
494+ member_class = Variable
495+ form_class = Form
496+
449497 @dispatch (
450498 gui__call_target = Form ,
451499 endpoint_dispatch_prefix = 'query' ,
0 commit comments